如何在两个字符串中找到导致它们变得不相等的字符?



我想在两个字符串中找到使它们不相等的字符并打印它们。

例如:

String str1 = "abcd";
String str2 = "abc";

输出 = "d">

我使用的代码如下所示:

public void removeUnequalChars() {
String str1 = "abcd";
String str2 = "abc";

String commonChars = "";
for (int i = 0; i < str.length(); i++) {
for (int j = 0; j < str2.length(); j++) {
if (str.charAt(i) == str2.charAt(j)) {
commonChars += str.charAt(i);
}
}
}
for(int i = 0; i < commonChars.length(); i ++)
{
String charToRemove = commonChars.charAt(i)+"";
str = str.replace(charToRemove, "");
str2 = str2.replace(charToRemove, "");
}

String s3= str+str2;
System.out.println(s3);
}

但是代码的问题在于,如果我们有重复的字符,则此解决方案不起作用。 例如:

String str1 = "abccd";
String str2 = "abc";

预期输出为"cd",但上面的代码只打印"d">

有没有解决这个问题的解决方案?

您可以使用 str.replaceFirst(( 来保留其他出现的字符,而不是使用 str.replace((。

您还需要使用较短的字符串代替 commonChar,然后还跟踪较短字符串中不在较长字符串中的任何字符。

所以它看起来像:

public String uncommonCharacters(String str, String str2){
String shorterString;
String longerString;
if (str.length() < str2.length()){
shorterString = str;
longerString = str2;
} else {
shorterString = str2;
longerString = str;
}
StringBuilder charsNotInLongString = new StringBuilder();
for(String charToRemove : shorterString.split("")) {
String newLongerString = longerString.replaceFirst(charToRemove, "");
if (newLongerString.equals(longerString)) {
charsNotInLongString.append(charToRemove);
} else {
longerString = newLongerString;
}
}
return longerString + charsNotInLongString.toString();
}

编辑:Woops没有意识到它被添加到commonChars中两次,根据评论进行了更新。

更新:刚到家,更新得更漂亮

这是我对字符串生成器的尝试

public static void main(String[] args) {
removeUnequalChars("abcd", "abc");
removeUnequalChars("abccd", "abc");
}
public static void removeUnequalChars(String str1Input, String str2Input) {
StringBuilder sb1 = new StringBuilder(str1Input);
StringBuilder sb2 = new StringBuilder(str2Input);
for (int i = 0; i < sb1.length(); i++) {
for (int j = 0; j < sb2.length(); j++) {
if (sb1.charAt(i) == sb2.charAt(j)) {
sb1.deleteCharAt(i--);
sb2.deleteCharAt(j--);
break;
}
}
}
System.out.println(sb1.append(sb2));
}

您需要检查字符是否已在 commonChars 数组中,将commonChars.contains(str.charAt(i))添加到相等验证中。

for (int j = 0; j < str2.length(); j++) {
if (str.charAt(i) == str2.charAt(j) && commonChars.contains(str.charAt(i)) {
commonChars += str.charAt(i);
}
}
}

这个呢:

class basic {
public static void removeUnequalChars(String str, String str2) {
String uncommonChars = "";
int maxlength = str.length();
if (maxlength < str2.length())
maxlength = str2.length();
for (int i = 0; i < maxlength; i++) {
if (i >= str.length()) {
uncommonChars += str2.charAt(i);
continue;
} else if (i >= str2.length()) {
uncommonChars += str.charAt(i);
continue;
}               
if (str.charAt(i) != str2.charAt(i)) {
uncommonChars += str2.charAt(i);
}
}
System.out.println(uncommonChars);
}
public static void main(String[] args) {
removeUnequalChars("abc", "abcd");
removeUnequalChars("abc", "abccd");
removeUnequalChars("bocd", "avcod");
}       
}

输出:

d
cd
avod

您可以对它们进行排序,然后对其进行分析:

const s1 = 'acb';
const s2 = 'abccd';
let s1Sort = s2.split('').sort();
let s2Sort = s2.split('').sort();
Math.max(s1.length, s2.length) === s1.length ? s1Sort = s1.split('').sort() : s2Sort = s1.split('').sort();
const unequal = [];
for(let i=0; i< Math.max(s1.length, s2.length); i++){    
s1Sort[i] !== s2Sort[i] ? unequal.push(s1Sort[i]) : '';
}
return unequal.join('')

存在三种情况:

  1. 第一个字符串大于第二个字符串
  2. 反之亦然
  3. 字符串具有相同的长度

。然后只是通过相同的索引比较字符串以找到差异。

这就是它的样子:

@SuppressWarnings("all")
public class Main {
private static List<Character> compare(String str1, String str2) {
if (str1 == null || str1.isEmpty())
return stringToChars(str2);
if (str2 == null || str2.isEmpty())
return stringToChars(str1);
if (str1.equals(str2))
return Collections.emptyList();
List<Character> diff = new ArrayList<>();
char[] arr1 = str1.toCharArray();
char[] arr2 = str2.toCharArray();
if (arr1.length > arr2.length) {
diff.addAll(compare90Degrees(Arrays.copyOf(arr1, arr2.length), arr2));
diff.addAll(stringToChars(new String(Arrays.copyOfRange(arr1, arr2.length, arr1.length))));
} else if (arr1.length < arr2.length) {
diff.addAll(compare90Degrees(arr1, Arrays.copyOf(arr2, arr1.length)));
diff.addAll(stringToChars(new String(Arrays.copyOfRange(arr2, arr1.length, arr2.length))));
} else {
diff.addAll(compare90Degrees(arr1, arr2));
}
return diff;
}
private static List<Character> compare90Degrees(char[] arr1, char[] arr2) {
if (arr1.length != arr2.length)
throw new IllegalArgumentException("arrays are differ in length");
List<Character> mismatch = new ArrayList<>();
for (int i = 0; i < arr1.length; i++) {
char c = arr1[i];
if (c != arr2[i])
mismatch.add(c);
}
return mismatch;
}
// to boxed collection
private static List<Character> stringToChars(String str) {
return str.chars().mapToObj(c -> (char) c).collect(Collectors.toList());
}
public static void main(String[] args) throws Exception {
System.out.println(compare("qwerty", "qwry"));
// prints [e, r, t, y]
}
}

compare("qwerty", "qwry").将第一个字符串与第二个字符串进行比较。

e符号根本不存在,其余的都有错误的索引。

最新更新