java 检查一个字符串是否与另一个字符串中除一个字符外的所有字符匹配

kgsdhlau  于 2023-01-07  发布在  Java
关注(0)|答案(5)|浏览(298)

我有一个字符串列表,对于每个字符串,我都要检查它的字符,和其他字符串的字符是否相同,除了一个字符。
例如,将返回true的检查将是checking
防锁摇
时钟和羊群有一个不同的特点,不多不少。
岩石对凹痕将明显地返回假。
我一直在考虑首先循环遍历列表,然后在列表中使用第二个循环来检查第一个字符串和第二个字符串。
然后使用split("");创建包含每个字符串的字符的两个数组,然后相互检查数组元素(即,将每个字符串与另一个数组1-1 2-2中的相同位置进行比较等),只要只有一个字符比较失败,则对这两个字符串的检查为真。
无论如何,我有很多字符串(4029),考虑到我目前正在考虑实现的内容,将包含3个循环,每个循环将导致一个立方循环(?),这将需要很长很长的时间与这么多的元素,不是吗?
有没有更简单的方法来做到这一点?或者这个方法实际上能正常工作?或者--希望不能--但是我提出的解决方案中是否存在某种潜在的逻辑缺陷?
多谢了!

tzxcd3kk

tzxcd3kk1#

为什么不采取天真的方式呢?

bool matchesAlmost(String str1, String str2) {
    if (str1.length != str2.length)
        return false;
    int same = 0;
    for (int i = 0; i < str1.length; ++i) {
        if (str1.charAt(i) == str2.charAt(i))
            same++;
    }
    return same == str1.length - 1;
}

现在你可以用一个二次算法来检查每一个字符串。

esbemjvw

esbemjvw2#

假设两个字符串的长度相等

String str1 = "rock";
        String str2 = "lick";

        if( str1.length() != str2.length() )
            System.out.println( "failed");

        else{
            if( str2.contains( str1.substring( 0, str1.length()-1)) || str2.contains(  str1.substring(1, str1.length() )) ){
                System.out.println( "Success ");
            }

            else{
                System.out.println( "Failed");
            }
        }
nbnkbykc

nbnkbykc3#

不确定这是否是最好的方法,但即使两个字符串长度不同,这一方法也能工作。cat & cattp它们只差一个字符p,并且t是重复的。看起来像是O(n)时间的解决方案,使用额外的空间来存放散列表和字符数组。

/**
 * Returns true if two strings differ by one character
 * @param s1 input string1
 * @param s2 input string2
 * @return true if strings differ by one character 
 */
boolean checkIfTwoStringDifferByOne(String s1, String s2) {
    char[] c1, c2;

    if(s1.length() < s2.length()){
        c1 = s1.toCharArray();
        c2 = s2.toCharArray();
    }else{
        c1 = s2.toCharArray();
        c2 = s1.toCharArray();
    }

    HashSet<Character> hs = new HashSet<Character>();

    for (int i = 0; i < c1.length; i++) {
        hs.add(c1[i]);
    }
    int count = 0;
    for (int j = 0; j < c2.length; j++) {
        if (! hs.contains(c2[j])) {
            count = count +1;
        }
    }

    if(count == 1)
        return true;
    return false;
}
nwnhqdif

nwnhqdif4#

假设所有字符串的长度都相同,我想这会有所帮助:

public boolean differByOne(String source, String destination)
{
    int difference = 0;

    for(int i=0;i<source.length();i++)
    {
        if(source.charAt(i)!=destination.charAt(i))
        {
            difference++;

            if(difference>1)
            {
                return false;
            }
        }
    }

    return difference == 1;
}
juzqafwq

juzqafwq5#

最好的方法是将字符串连接在一起,一个向前,另一个以相反的顺序。然后检查两端匹配的字符,并从中间开始向两端匹配的字符单循环。如果超过2个字符不匹配中断。
如果一个不匹配,则停止并等待下一个完成,如果它到达相同的位置,则它匹配,否则只返回false。

public static void main(String[] args) {
    New1 x = new New1();
    x.setFunc();
}

static void setFunc() {
    Set s = new HashSet < Character > ();
    String input = " aecd";
    String input2 = "abcd";
    String input3 = new StringBuilder(input2).reverse().toString();
    String input4 = input.concat(input3);
    int length = input4.length();

    System.out.println(input4);
    int flag = 0;

    for (int i = 1, j = length - 1; j > i - 1; i++, j--) {

        if (input4.charAt(i) != input4.charAt(j)) {

            System.out.println(input4.charAt(i) + " doesnt match with " + input4.charAt(j));
            if (input4.charAt(i + 1) != input4.charAt(j)) {
                System.out.println(input4.charAt(i + 1) + " doesnt match  with " + input4.charAt(j));
                flag = 1;
                continue;
            } else if (input4.charAt(i) != input4.charAt(j - 1)) {
                System.out.println(input4.charAt(i) + " doesnt match with " + input4.charAt(j - 1));
                flag = 1;
                break;
            } else if (input4.charAt(i + 1) != input4.charAt(j - 1) && i + 1 <= j - 1) {
                System.out.println(input4.charAt(i + 1) + " doesnt match with xxx " + input4.charAt(j - 1));
                flag = 1;
                break;
            }
        } else {
            continue;
        }
    }

    if (flag == 0) {
        System.out.println("Strings differ by one place");
    } else {
        System.out.println("Strings does not match");
    }
}

相关问题