【问题标题】:How to compare 2 strings containing same characters如何比较包含相同字符的2个字符串
【发布时间】:2010-08-23 18:21:11
【问题描述】:

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

假设String1= "qwerty"String2= "qywter"。现在这些字符串包含相同的字符但顺序不同。那么有什么函数可以用来显示这些字符串包含相同的字符吗? equals() 方法能做到吗???

感谢所有帮助。

【问题讨论】:

  • 字符相同,但字符数不同的情况下,结果应该是什么? (如“qwerty”和“qywtery”?)它们包含相同的字符,但字符数不同。

标签: java


【解决方案1】:
char[] chars1 = string1.toCharArray();
char[] chars2 = string2.toCharArray();
Arrays.sort(chars1);
Arrays.sort(chars2);

return Arrays.equals(chars1, chars2);

【讨论】:

  • @prasad - 我不明白你的评论
  • 我的意思是,做“返回 Arrays.equals(chars1, chars2);”语句返回一个布尔值或一个整数??
【解决方案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】:

    您可以使用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(或 Unicode 代码点)(而不是 toCharArray()),并且可能使用线性时间 counting sort

    如果您不关心特定字符计数匹配(例如,"xxxyyy""xy" 具有相同的字符,尽管数字不同),那么您可以使用类似集合的表示 (java.util.BitSet)。

    // 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
    

    【讨论】:

      【解决方案4】:
      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() >> char.MaxValue 并且它具有较低的大 O 表示法复杂度时,这是更可取的解决方案。

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

      【讨论】:

      • 有趣的方法,虽然肯定不是 Java。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        如果你有一个长字符串需要比较,并且你不需要保证成功,你可以这样做:

        1. 确保字符串长度相同
        2. 每张图片
        3. 将所有字符相加(转换为整数)
        4. 将字符的正方形相加(再次转换为整数)
        5. 比较平方和和总和
        6. 如果它们相同,则字符串包含相同的字符。

        实际上,我花了一些时间试图弄清楚这在哪里行不通,但我想不出一个。我的直觉告诉我我在这里遗漏了一些东西,或者这是这个案例的一个很好的比较器。

        【讨论】:

          【解决方案7】:

          需要两个步骤

          1. 对两个字符串进行异或运算,如果异或为 0,则您可以部分确定。

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

          希望对你有帮助

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2018-04-23
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多