Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 检查两个字符串是否包含类似的子字符串_Java_String - Fatal编程技术网

Java 检查两个字符串是否包含类似的子字符串

Java 检查两个字符串是否包含类似的子字符串,java,string,Java,String,我正在尝试编写一个程序,该程序的一部分是发现两个字符串之间的相似性。您询问用户字符串中应该包含多少个类似的字母 例如: string1 = aghilfamjijasrnlklk; string2 = dfdfkkjhklkfnajnvfo; 用户类型3 程序打印: klk is similar in both starts at index 16, ends at 19 in string 1 starts at index 8, ends at 11 in string 2 我所尝试的

我正在尝试编写一个程序,该程序的一部分是发现两个字符串之间的相似性。您询问用户字符串中应该包含多少个类似的字母

例如:

string1 = aghilfamjijasrnlklk;
string2 = dfdfkkjhklkfnajnvfo;
用户类型3

程序打印:

klk is similar in both 
starts at index 16, ends at 19 in string 1
starts at index 8, ends at 11 in string 2
我所尝试的:

for (int i = 0; i <= search; i++) {
        if (string1.regionMatches(i, string2, 0, substringlength)) {
            found = true;
            System.out.print("Match found!");

            break;


        }
    }

for(int i=0;i我猜实现这一点的方法是使用LCS算法(最长的公共子序列),最后只取算法给出的前X个字符。(当然,这不是计算速度最快的,但该算法几乎完全由其他人编写)

例如,如果用户只需要3个字符,LCS(计算机,uouthgr)将给您一个字符串值“outr”,并给他子字符串“out”

这是我在网上找到的LCS代码(需要修改才能满足您的需要):

公共类LCS{

public static void main(String[] args) {
    String x = StdIn.readString();
    String y = StdIn.readString();
    int M = x.length();
    int N = y.length();

    // opt[i][j] = length of LCS of x[i..M] and y[j..N]
    int[][] opt = new int[M+1][N+1];

    // compute length of LCS and all subproblems via dynamic programming
    for (int i = M-1; i >= 0; i--) {
        for (int j = N-1; j >= 0; j--) {
            if (x.charAt(i) == y.charAt(j))
                opt[i][j] = opt[i+1][j+1] + 1;
            else 
                opt[i][j] = Math.max(opt[i+1][j], opt[i][j+1]);
        }
    }

    // recover LCS itself and print it to standard output
    int i = 0, j = 0;
    while(i < M && j < N) {
        if (x.charAt(i) == y.charAt(j)) {
            System.out.print(x.charAt(i));
            i++;
            j++;
        }
        else if (opt[i+1][j] >= opt[i][j+1]) i++;
        else                                 j++;
    }
    System.out.println();

}
publicstaticvoidmain(字符串[]args){
字符串x=StdIn.readString();
字符串y=StdIn.readString();
int M=x.length();
int N=y.长度();
//opt[i][j]=x[i..M]和y[j..N]的LCS长度
int[][]opt=新int[M+1][N+1];
//通过动态规划计算LCS和所有子问题的长度
对于(int i=M-1;i>=0;i--){
对于(int j=N-1;j>=0;j--){
如果(x.charAt(i)=y.charAt(j))
opt[i][j]=opt[i+1][j+1]+1;
其他的
opt[i][j]=Math.max(opt[i+1][j],opt[i][j+1]);
}
}
//恢复LCS本身并将其打印到标准输出
int i=0,j=0;
而(i=opt[i][j+1])i++;
else-j++;
}
System.out.println();
}
}

有关更多详细信息,我建议阅读:


但是,如果你像我一样,我会建议你在youtube上查找更多关于这个主题的视频!

我们可以看看你尝试了什么吗?到目前为止,我已经尝试使用regionMatch,但只有当它们都以相同的字符串开头时,这才有效。你需要编写一个算法,从字符串1开始,得到一个n大小(其中n是用户输入大小,如3)从0开始的子字符串。然后在字符串2中搜索该子字符串。然后移动到字符串1中的位置1,并在字符串2中重复每次搜索。