数据结构--KMP算法(字符串匹配算法)--在末尾添加字符串,是其包含字符串两次,且长度最短

在末尾添加字符串,使其包含字符串两次,且长度最短

* 找出字符串的next数组,然后添加的部分就是字符串的最后一个字符的next值到最后一个位置的值,这是最大前缀和最大后缀相等的地方
* 注意这里要找的是字符串中后面字符和前面字符匹配的最长位置,所以这里的 next.length = str.length() + 1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public class ShortestHaveTwice {
    public static String shortestHaveTwice(String str){
        int[] next = nextArray(str);
        System.out.println(next[str.length()]);
        return str + str.substring( next[str.length()] );
    }
 
    private static int[] nextArray(String str) {
        if(str == null || str.length() == 0) return null;
 
        int[] next = new int[str.length() + 1];
        next[0] = -1;
        next[1] = 0;
        int num = 0;
        int index = 2;
        while(index < next.length){
            if(str.charAt( index - 1 ) == str.charAt( num )){
                next[index++] = ++num;
            } else if(num > 0){
                num = next[num];
            } else{
                next[index++] = 0;
            }
        }
        return next;
    }
 
    public static void main(String[] args){
        String s = shortestHaveTwice("ababaas");
        System.out.println(s);
    }
}

  

posted @   SkyeAngel  阅读(197)  评论(0编辑  收藏  举报
编辑推荐:
· ASP.NET Core - 日志记录系统(二)
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
阅读排行:
· 终于决定:把自己家的能源管理系统开源了!
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(一):从.NET IoT入
· C#实现 Winform 程序在系统托盘显示图标 & 开机自启动
· ASP.NET Core - 日志记录系统(二)
· 实现windows下简单的自动化窗口管理
点击右上角即可分享
微信分享提示