如何比较包含相同字符的2个字符串

时间:2010-08-23 18:21:11

标签: java

我的问题是,我有两个字符串,比如String1& String2的。现在我想检查这两个字符串是否包含相同的字符,不管它们的顺序如何。

假设String1= "qwerty"String2= "qywter"。现在这些字符串包含相同的字符,但序列不同。那么有没有可用于显示这些字符串包含相同字符的函数?可以用equals()方法做那个???

感谢所有帮助。

7 个答案:

答案 0 :(得分:17)

char[] chars1 = string1.toCharArray();
char[] chars2 = string2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);

return Arrays.equals(chars1, chars2);

答案 1 :(得分:2)

您可以使用String.equals,虽然是间接的。首先,您需要一个辅助方法:

// given a String, sorts its chars and return it as another String
public static String sorted(String s) {
    char[] arr = s.toCharArray();
    Arrays.sort(arr);
    return new String(arr);
}

然后你可以:

    String s1 = "qwerty";
    String s2 = "qywter";

    System.out.println(sorted(s1)); // eqrtwy

    System.out.println(sorted(s1).equals(sorted(s2))); // true

请注意,这不是最有效的算法 - 它是O(N log N)时间,并且使用了无关的空间 - 但是对于短字符串应该可以正常工作。对于长字符串,您需要手动(而不是char)遍历每个toCharArray()(或Unicode代码点),并且可能使用线性时间counting sort

如果你不关心特定的字符数匹配(例如"xxxyyy""xy"具有相同的字符,虽然数字不同),那么你可以使用类似集合的表示({{ 3}})。

// given a string, returns its used char set as a java.util.BitSet
public static BitSet usedChar(String s) {
    BitSet bs = new BitSet();
    for (int i = 0; i < s.length(); i++) {
        bs.set(s.charAt(i));
    }
    return bs;
}

然后你可以:

    System.out.println(
        usedChar("xxxyyy").equals(usedChar("xy"))
    ); // true

    System.out.println(
        usedChar("xyz").equals(usedChar("abc"))
    ); // false

答案 2 :(得分:2)

这取决于你是否真的想要字符或者你真的想要代码点,然后重要的是你是否要计算重复数。这是一个解决方案:

public class a {
  public static void main(String[] args) {
    String s1 = "qwerty";
    String s2= "qywter";
    System.out.println(codePointSet(s1).equals(codePointSet(s2)));
  }
  public static Set<Integer> codePointSet(String s) {
    Set<Integer> set = new TreeSet<Integer>();
    for (int i = 0, cp; i < s.length(); i += Character.charCount(i)) {
      cp = s.codePointAt(i);
      set.add(cp);
    }
    return set;
  }
}

答案 3 :(得分:1)

int[] f = new int[(int)char.MaxValue];
foreach (var c in string1) f[(int)c]++;
foreach (var c in string2) f[(int)c]--;
return f.Max() == 0 && f.Min() == 0;

这是string1.length()&gt;&gt;时的首选解决方案char.MaxValue并且它具有较低的大O符号复杂度。

编辑这实际上是C#代码,但您可以在Java轻松实现类似的结果。

答案 4 :(得分:0)

String.equals()不适合您的具体情况。您可能需要编写自己的方法来以这种方式等同字符串。

答案 5 :(得分:0)

如果您需要比较长字符串,并且不需要成功保证,则可以执行以下操作:

  1. 确保字符串长度相同
  2. 每张图片
  3. 将所有字符(作为整数)加起来
  4. 加上字符的方块(再次表示为整数)
  5. 比较平方和和的总和
  6. 如果它们相同,则字符串包含相同的字符。
  7. 实际上我花了一些时间试图弄清楚哪些不起作用,但我想不出一个。我的直觉告诉我,我在这里遗漏了一些东西,或者对于这种情况,这是一个很好的比较。

答案 6 :(得分:0)

需要两个步骤

  1. 对两个字符串执行xor,如果xor为0,那么您可以部分确定。

  2. 如果xor为0,则找到两个字符串的ascii值之和,如果ascii sum相同则 两个字符串都相同。

  3. 希望这有帮助