【算法】字符串平移

需求 我们规定,字符串平移是指将字符串最左边的字符移动到最右边,其他位置的字符保持不变。现在,输入两个字符串,尝试编程判断第2个字符串是否 可以由第1个 字符串平移得到。例如输入“hello”和“llohe”,则需要返回True作为答案,因为将“hello”平移一次将变成“elloh”,再平移一次就 会变成“llohe”。 思路 本题的核心在于如何进行字符串的平移操作。我们分析一下字符串平移的特点可以发现,每平移一次...

[阅读更多 →]

【算法】查找常用字符

需求 输入一组字符串,将其中的常用字符查找出来,常用字符的定义为:所输入的一组字符串中,所有的字符串中都包含此字符, 则此字符就被定义为常用字符。例如,假设我们输入一组字符串为["ball", "gad", "apple"], 则最终需要返回["a"], 因为只有字符“a”在输入的3个字符串中都出现了。如果输入["cool&qu...

[阅读更多 →]

【算法】求最长不含重复字符的子字符串长度

需求 输入一个字符串,尝试编程找到其中最长的不包含重复字符的子字符串,并将其长度返回。例如,输入“aaa”,将返回1作为结果, 输入“abcabcbb”,将返回3作为结果。 思路 本题需要查找的是最长的不含重复字符的子串,首先可以先确定一个起始点,之后计算从此起始点向后截取可以得到的不含重复字符的最长子串的长度, 之后依次向后移动起始点,循环计算子串长度的操作,最终取长度最大的结果返回即可。核心思路可以总结如下: ...

[阅读更多 →]

【算法】查找第一次出现的唯一字符

需求 输入一个字符串,编程找到此字符串中第一次出现的唯一字符,尝试将其返回,如果字符串中不存在唯一字符,则返回空字符串。例如,输入“acddaeef”, 将返回“c”,因为字符“c”和“f”是字符串中的唯一字符,字符“c”是首次出现的。 思路 本题除了要找到字符串中的唯一字符外,更关键的是对唯一字符串出现的顺序进行记录,根据题目的要求,我们需要返回第一次出现的唯一字符。 因此,在设计算法时,我们可以采用两种不同的数据...

[阅读更多 →]

【算法】统计连续字符的长度

需求 输入一个字符串,尝试编程返回其中最长的连续重复字符的长度。例如,输入字符串“abbbcdeff”,其中最长的连续重复字符组成的子串为“bbb”, 因此需要返回3作为答案。如果输入“hello”,需要返回2作为答案,因为其中最长的连续重复字符组成的子串为“ll”。 思路 本题是一道非常经典的字符串编程题。在编程工程师相关职位的面试中,本题的出场率也非常高。解题思路也比较简单,过程如下: 对字符串进行遍历,记录当...

[阅读更多 →]

【算法】分割字符串获取最大分数

需求 输入一个只有“0”和“1”组成的字符串,其长度不小于2,我们需要将其从某个位置分割成左右两个子串(子串的长度都大于0), 在左串中,每出现一个0,则计1分,在右串中,每出现一个1,则计1分,尝试编程计算出所有分割方案中最高可以得多少分, 并将分数返回。例如,如果输入“00111”,当分割的左子串为“00”,右子串为“111”时得分最高,为5分,我们需要返回5作为正确答案。 思路 根据题目中的要求,我们能够明确每...

[阅读更多 →]

【算法】分割出回文字符串

需求 要求输入一个字符串,将此字符串分割成一些子串,使每个子串都是回文串(单字符的字符串也属于回文串)。 例如输入字符串"abb",则返回: ["a", "b", "b"], ["a", "bb"], 思路 本题的核心是将字符串分割出多个回文的子字符串。判断某个字符串是不是回文字符串非常简单,我们直接将字符串进行逆序,然后判断与原字符串是否相同即可。 对字符串进行分割的过程实际上是一个递归的过程,...

[阅读更多 →]

【算法】平衡字符串的分割

输入一个只包含“L”和“R”的字符串,并且其中"L"与"R"的个数是相等的。符合这种输入条件的字符串称为平衡字符串。尝试编程对输入的平衡字符串进行分割, 尽可能多地分割出平衡字符串子串,并将可以得到的子串数量返回。 例如,输入“RLLLRRRL”将返回3,其可以分割成“RL”、“LLRR”和“RL”。输入“LLLRRR”将返回1,因为其只能分割出“LLLRRR”。 思路 本题非...

[阅读更多 →]

【算法】交换字符 (2)

需求 给定两个字符串A和B,可以对A中的任意字符进行替换,如果要替换某个字符,则所有的此字符都要替换成相同字符。 需要判断字符串A是否可以通过字符替换得到字符串B。 例如,如果输入字符串A为“addca”,字符串B为“cookc”,则字符串A可以通过字符替换得到字符串B。 因为将A字符串中的字符'a'替换为'c','d'替换为'o','c'替换为'k'即可得到字符串B。 思路 需要判断输入的两个字符串相同位置的字符是...

[阅读更多 →]

【算法】交换字符 (1)

需求 输入两个字符串,如果交换第1个字符串中的两个字符后就可以得到第2个字符串,则表明这两个字符串可以相互转换。 例如输入“acb”和“cab”,可以满足转换。 思路 要满足转换条件,两个字符串需要满足如下条件: 如果两个字符串完全相同,则只有字符串中存在重复的字符时才满足条件(将重复的字符交换一次)。 如果两个字符串不同,则它们的长度需要相同,并且两个字符串只有两个位置的字符相异(假设为m位和位)。 判断字符串A...

[阅读更多 →]

【算法】根据字符出现的频率进行排序

需求 输入一个字符串,对字符串的字符进行排列,按照其中字符的出现频率降序进行排序。 思路 可以定义一个字典,字典的key是字符,value是出现的次数,然后按照value进行排序。 大部分语言都可以对字典排序,但是go不支持,需要定义一个切片再排序重组。 实现 package chapter03 import ( "sort" "strings" ) type Pair struct { ...

[阅读更多 →]

【算法】格式字符串进阶

需求 给定一个字符串,检查是否可以重新排列字符串,使结果满足如下条件: 相邻的字符不相同 如果满足条件,则返回任意可行的结果,否则返回空字符串。 比如,给定字符串 "aab",返回 "aba"。 思路 首先需要找到一种算法来不同都字符穿插排列。并非任何场景的输入都可以构成新的字符串,因此我们需要一种算法来检查是否可以构成新的字符串, 比如输入"aaaa",则无论怎么排列,都无法满足题目都排列要求。 实际上,如果能...

[阅读更多 →]

【算法】格式化字符串

需求 给定一个混合数字和字母的字符串,尝试编写程序对字符串进行格式化,使得新的字符串满足如下条件: 相同类型的字母不能相连,即数字的左右必须是字母,字母的左右必须是数字。 如果无法满足上述条件,则返回空字符串。 思路 根据需求,字符被分为数字型和字母型这两类,那么第一步就需要对字符进行分类。 分类完成后需要重新组合,如果这两类字符的数量大于1,则不能满足条件,返回空字符串。满足条件则取出字符重新排列成新的字符串。...

[阅读更多 →]

使用 vscode 插件实现 leetcode 刷题

一般刷算法题我都是去leetcode官网,但每次都要去网页提交代码,想练习的时候还是有点麻烦,看到vscode有刷题插件就来推荐了。为了能正常使用该插件,需要先安装node。 可以直接去vscode搜索leetcode,一般排在第一的是下载量最高的,点击直接安装。 下载完之后设置节点: 这里选择中国节点: 设置好之后按shift+ctrl+p,在输入框输入leetcode,然后选择登录: 这里推荐使用cook...

[阅读更多 →]