方便对算法知识进行查询,尤其是遇到类似算法又遗忘时。
一、判断两个字符串是否互为旋转词
【旋转词定义】
给定一个str,若将其前面任意部分移动到后面的生成字符串称为str的旋转词。
例如:"1234"的旋转词有"1234"、"2341"、"3412"、"4123"。
【算法解析】
二、单词逆序调整
【单词逆序调整定义】
给定一个str,在单词间做逆序调整。
例如:"I love bunches!"调整后为"bunches! love I"
【算法解析】
三、块逆序调整
【块逆序调整定义】
给定一个str和一个整数i,将str[0...i]与str[i+1...length-1]互换位置。
例如:str="ABCDE",i=2,则返回"DEABC"
【算法解析】
四、寻找字典顺序最小的拼接串
【需求定义】
给定一个字符串数组strs,寻找一种拼接顺序,使得拼接的字符串字典顺序最小。
例如:strs =["b", "ba"],则返回"bab"
【算法解析】
五、KMP算法
KMP算法详解
**这篇文章写得非常好,强烈推荐。此处为速查,不再详细描述。
1.next[]的理解
next[]数组是KMP算法的核心,只要理解透彻,就能轻松掌握KMP算法。
next[]代表模式串p与主串失配时,在不回溯主串t的遍历指针i的情况下,下一次t[i]应该与p中那个位置的字符进行比较。
2.简单描述,记忆唤醒
next[]数组求解算法如下:
public static int[] getNext(String p) { //p为模式串 int[] next = new int[p.length]; //初始化,第一个位置的next设置为-1,方便做判断 next[0] = -1; int j = 0; int k = -1; while (j < p.length - 1) { //k==-1表示没有匹配的子串,只能从头开始遍历 if (k == -1 || p[j] == p[k]) { next[++j] = ++k; } else { //此处的理解最关键,可以结合链接给出的文章学习。 k = next[k]; } } return next; }
改进的next[]数组求解算法如下,不同之处在于,增加了判断,防止"ABABAB","AAAA"这一类的字符串出现一些无效的匹配,增加效率。
public static int[] getNext(String p) { int[] next = new int[p.length]; next[0] = -1; int j = 0; int k = -1; while (j < p.length - 1) { if (k == -1 || p[j] == p[k]) { if (p[++j] == p[++k]) { // 当两个字符相等时要跳过 next[j] = next[k]; } else { next[j] = k; } } else { k = next[k]; } } return next; }