我的问题是,我有两个字符串,比如String1& String2的。现在我想检查这两个字符串是否包含相同的字符,不管它们的顺序如何。
假设String1= "qwerty"
,String2= "qywter"
。现在这些字符串包含相同的字符,但序列不同。那么有没有可用于显示这些字符串包含相同字符的函数?可以用equals()方法做那个???
感谢所有帮助。
答案 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)
如果您需要比较长字符串,并且不需要成功保证,则可以执行以下操作:
实际上我花了一些时间试图弄清楚哪些不起作用,但我想不出一个。我的直觉告诉我,我在这里遗漏了一些东西,或者对于这种情况,这是一个很好的比较。
答案 6 :(得分:0)
需要两个步骤
对两个字符串执行xor,如果xor为0,那么您可以部分确定。
如果xor为0,则找到两个字符串的ascii值之和,如果ascii sum相同则 两个字符串都相同。
希望这有帮助