小明的字符串(kmp)

简介: 小明的字符串(kmp)

记录一道KMP的题目,

这道题对于刚接触kmp的同学来说算是一道不错的题目了,

能够帮助我们理解得更深刻...

题目:小明的字符串

题目描述

小明有两个字符串,分别为 S,T。


请你求出 TT 串的前缀在 S 串中出现的最长长度为多少。


输入描述

输入包含两行,每行包含一个字符串,分别表示 S,T。


1 < |S|,|T| < 10^6 ,保证 S,T 只包含小写字母。


输出描述

输出共 1 行,包含一个整数,表示答案。


输入输出样例

示例 1


输入


aabba


abb


输出


3


示例 2


输入


aabba


aba


输出


2


运行限制

最大运行时间:1s

最大运行内存: 256M

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str1 = scanner.nextLine();
        String str2 = scanner.nextLine();
        int[] next = kmpNext(str2);
        int temp;
        for (int i = str2.length(); i > 0; i--) {
            temp = kmpSearch(str1, str2.substring(0, i), next);
            if (temp != -1) {
                System.out.println(temp);
                break;
            }
        }
    }
    private static int kmpSearch(String str1, String str2, int[] next) {
        int j = 0;
        for (int i = 0; i < str1.length(); i++) {
            while (j > 0 && str1.charAt(i) != str2.charAt(j))
                j = next[j - 1];
            if (str1.charAt(i) == str2.charAt(j))
                j++;
            if (j == str2.length()) return str2.length();
        }
        return -1;
    }
    private static int[] kmpNext(String str2) {
        int[] next = new int[str2.length()];
        int j = 0;
        for (int i = 1; i < str2.length(); i++) {
            while (j > 0 && str2.charAt(i) != str2.charAt(j))
                j = next[j - 1];
            if (str2.charAt(i) == str2.charAt(j))
                j++;
            next[i] = j;
        }
        return next;
    }
}
相关文章
|
11月前
|
算法 JavaScript 测试技术
较难理解的字符串查找算法KMP
较难理解的字符串查找算法KMP
|
4月前
|
C++ 索引
c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)
c++:string相关的oj题(415. 字符串相加、125. 验证回文串、541. 反转字符串 II、557. 反转字符串中的单词 III)
61 0
|
4月前
|
算法
【错题集-编程题】小红的ABC(字符串 + 找规律)
【错题集-编程题】小红的ABC(字符串 + 找规律)
|
4月前
|
索引
《华为机试》——查找两个字符串a,b中的最长公共子串
《华为机试》——查找两个字符串a,b中的最长公共子串
字符串中的KMP算法及其改进
字符串中的KMP算法及其改进
|
4月前
|
canal Java
java字符串练习题7、验证回文串
java字符串练习题7、验证回文串
77 0
|
4月前
|
机器学习/深度学习 Java
java字符串练习题3、字符串中字符是否相同判断
java字符串练习题3、字符串中字符是否相同判断
52 0
|
算法 Linux
字符串-KMP算法
字符串-KMP算法
65 0
|
算法
【数据结构与算法】字符串2:KMP & 实现 strStr() & 重复的子字符串
【数据结构与算法】字符串2:KMP & 实现 strStr() & 重复的子字符串
70 0