Java 匹配两个字符串的前n个字母的字符串

Java 匹配两个字符串的前n个字母的字符串,java,string,pattern-matching,Java,String,Pattern Matching,所以对于我面临的一个问题,我想知道一个序列(从索引0开始)有多长,两个字符串是“相同的”——我想只举个例子会更清楚 如果两个字符串是“Yellowstone”和“Yelling”,我希望该方法返回4,这意味着两个字符串的前4个字符匹配(“Yell”) 除了重复这两个单词,还有什么(时间)更有效的方法吗?我可以使用某种内置方法吗?(对于我的任务,我希望避免导入任何自定义lib)您不必反复阅读这两个文本。遍历较小的一个,并比较相同索引处的字符。在发现不匹配时中断 String a ="Yello

所以对于我面临的一个问题,我想知道一个序列(从索引0开始)有多长,两个字符串是“相同的”——我想只举个例子会更清楚

  • 如果两个字符串是“Yellowstone”和“Yelling”,我希望该方法返回4,这意味着两个字符串的前4个字符匹配(“Yell”)

除了重复这两个单词,还有什么(时间)更有效的方法吗?我可以使用某种内置方法吗?(对于我的任务,我希望避免导入任何自定义lib)

您不必反复阅读这两个文本。遍历较小的一个,并比较相同索引处的字符。在发现不匹配时中断

String a ="Yellow";
String b= "Yelling";
String smaller = (a.length < b.length) ? a:b;
int ret =0;
for (index based on smaller ){
  compare character using charAt and if matching ret++, else break;
}
return ret;
String a=“黄色”;
String b=“叫喊”;
字符串较小=(a.length
//如果希望字符不区分大小写,请将其与equalsIgnoreCase一起使用。
String.valueOf(a.charAt(index)).equalsIgnoreCase(String.valueOf(b.charAt(index)))

您不必反复阅读这两个文本。遍历较小的一个,并比较相同索引处的字符。在发现不匹配时中断

String a ="Yellow";
String b= "Yelling";
String smaller = (a.length < b.length) ? a:b;
int ret =0;
for (index based on smaller ){
  compare character using charAt and if matching ret++, else break;
}
return ret;
String a=“黄色”;
String b=“叫喊”;
字符串较小=(a.length
//如果希望字符不区分大小写,请将其与equalsIgnoreCase一起使用。
String.valueOf(a.charAt(index)).equalSignalCase(String.valueOf(b.charAt(index)))

更正:

Sachin Chauhan的答案确实是正确的,并且在运行时更好(即使用二进制搜索来搜索第一个差异)

对于长度没有太大影响的情况(即相对较短的字符串),我将留下我的答案,以便为程序员留出一个更简单的解决方案,但最好是一个简单的解决方案

以下是原始答案:

由于它是一个简单的循环,我怀疑任何内置方法都不会有太多的“程序员”时间改进(当然也没有太多值得一提的运行时改进)

作为记录,我不知道有这样的Java方法(可能是一些外部库,但您已经声明希望避免它们)

我想,参考代码应该是这样的:

public int longestCommonPrefixLength(String s1, String s2) {

    if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0) {
        return 0;
    }

    int commonPrefixLength = 0;

    for (int i = 0; i < Math.min(s1.length(), s2.length()); i++) {
        if (s1.charAt(i) == s2.charAt(i)) {
            commonPrefixLength++;
        } else {
            break;
        }
    }

    return commonPrefixLength;
}
6行以下

要达到(正确的)极限:

public int longestCommonPrefixLength 2(字符串s1、字符串s2){
如果(s1==null | | s1.length()==0 | | s2==null | | s2.length()==0)返回0;
int i=0;
对于(;i
6 LOC:)

顺便说一句,有些奇怪的东西:


String
类有
boolean regionMatches(int-toffset,String-other,int-ooffset,int-len)
方法(对于给定的
len
),您也可以迭代地增加
len
,直到它不再返回true,但这不会达到同样的效率,当然可以。

更正:

Sachin Chauhan的答案确实是正确的,并且在运行时更好(即使用二进制搜索来搜索第一个差异)

对于长度没有太大影响的情况(即相对较短的字符串),我将留下我的答案,以便为程序员留出一个更简单的解决方案,但最好是一个简单的解决方案

以下是原始答案:

由于它是一个简单的循环,我怀疑任何内置方法都不会有太多的“程序员”时间改进(当然也没有太多值得一提的运行时改进)

作为记录,我不知道有这样的Java方法(可能是一些外部库,但您已经声明希望避免它们)

我想,参考代码应该是这样的:

public int longestCommonPrefixLength(String s1, String s2) {

    if (s1 == null || s1.length() == 0 || s2 == null || s2.length() == 0) {
        return 0;
    }

    int commonPrefixLength = 0;

    for (int i = 0; i < Math.min(s1.length(), s2.length()); i++) {
        if (s1.charAt(i) == s2.charAt(i)) {
            commonPrefixLength++;
        } else {
            break;
        }
    }

    return commonPrefixLength;
}
6行以下

要达到(正确的)极限:

public int longestCommonPrefixLength 2(字符串s1、字符串s2){
如果(s1==null | | s1.length()==0 | | s2==null | | s2.length()==0)返回0;
int i=0;
对于(;i
6 LOC:)

顺便说一句,有些奇怪的东西:


String
类有
boolean regionMatches(int-toffset,String-other,int-ooffset,int-len)
方法(对于给定的
len
),您也可以迭代地增加
len
,直到它不再返回true,但这不会达到同样的效率,当然。

我认为最快的方法是使用Binaray搜索,它将为您提供O(logn)复杂度,而不是O(n)。 这里n是最小字符串的长度

这种方法在二进制搜索中很简单。在两个字符串中查找索引字符的相似性结束。例如,如果i是您的索引,则检查i+1中的不相似字符,其中i索引处的字符相似。如果是这样的话,请返回我作为您的答案。或者继续在子范围中搜索

编辑

添加函数以便更好地理解

int lengthOfFirstSimilarCharacters(String str1, String str2) {
    int strlen1 = str1.length();
    int strlen2 = str2.length();
    if(strlen1 > strlen2){
        return lengthOfFirstSimilarCharacters(str2,str1);
    }
    int i = 0;
    int j = strlen1-1;
    while(i<=j){
        int mid = i + (j-i)/2;
        if(str1.charAt(mid) == str2.charAt(mid)) {
            if(mid+1<strlen1 && str1.charAt(mid+1) != str2.charAt(mid+1)){
                return mid+1;
            }
            i = mid+1;
        }else{
            j = mid-1;
        }
    }
    return i;
}
int lengthOfFirstSimilarCharacters(字符串str1、字符串str2){
int strlen1=str1.length();
int strlen2=str2.length();
如果(strlen1>strlen2){
返回lengthOfFirstSimilarCharacters(str2、str1);
}
int i=0;
int j=strlen1-1;

而(i我认为最快的方法是使用Binaray搜索,这将为您提供O(logn)复杂度,而不是O(n)。 这里n是最小字符串的长度

方法是sim
    String s1 = "Yellow";
    String s2 = "Yelling";
    int limit = (s1.length() > s2.length() ? s2.length() : s1.length()) - 1;
    int ret = IntStream.range(0, limit)
                .filter(i -> s1.charAt(i) != s2.charAt(i))
                .findFirst().orElse(-1);
    //-1 if the Strings are the same.