方便对算法知识进行查询,尤其是遇到类似算法又遗忘时。

一、判断两个字符串是否互为旋转词

【旋转词定义】

   给定一个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;

}