【发布时间】:2019-03-22 12:28:41
【问题描述】:
我正在编写一个函数,它接受两个字符串,并且应该从一个或两个字符串中删除字符,直到两个字符串具有完全相同的字符。然后,我应该返回需要删除的字符数才能实现两者的字谜状态。我得到了奇怪的输出(并通过了一个测试用例)。谁能告诉我我的功能哪里出错了?
public class Solution {
static int makeAnagram(String a, String b, int aLeng, int bLeng) {
StringBuilder stringA = new StringBuilder(a);
StringBuilder stringB = new StringBuilder(b);
int result=0;
for (int i=0; i<stringB.length();i++)
{
if (a.contains(b.substring(i)))
continue;
else
stringB.deleteCharAt(i);
}
for (int i=0; i<stringA.length();i++)
{
//if(stringB.toString().contains(stringA.toString().substring(i)))
if (b.contains(a.substring(i)))
continue;
else
stringA.deleteCharAt(i);
}
if (stringA.length()==stringB.length())
result = (aLeng-stringA.length()) + (bLeng-stringB.length());
else
result = -1;
return result;
}
private static final Scanner scanner = new Scanner(System.in);
public static void main(String[] args) throws IOException {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(System.getenv("OUTPUT_PATH")));
String a = scanner.nextLine();
String b = scanner.nextLine();
int aLeng = a.length();
int bLeng = b.length();
int res = makeAnagram(a, b, aLeng, bLeng);
bufferedWriter.write(String.valueOf(res));
bufferedWriter.newLine();
bufferedWriter.close();
scanner.close();
}
}
测试用例 1
Input (stdin)
cde
abc
Your Output (stdout)
4
Expected Output
4
测试用例 2
Input (stdin)
fcrxzwscanmligyxyvym
jxwtrhvujlmrpdoqbisbwhmgpmeoke
Your Output (stdout)
-1
Expected Output
30
Compiler Message
Wrong Answer
测试用例 3
Input (stdin)
showman
woman
Your Output (stdout)
6
Expected Output
2
Compiler Message
Wrong Answer
【问题讨论】:
-
在最后一个示例中,如果您删除
s和h,则剩下“owman”和“woman”。这些是彼此的字谜。这就是为什么答案是 2。 -
是的,我知道。更困惑为什么我的方法没有返回 2。
-
您需要对每个字符串中的每个字符进行计数,然后比较计数。例如,如果第一个字符串是“aabbaa”,第二个字符串是“bbbaaa”,那么第一个字符串的计数是
{a=4, b=2},第二个字符串的计数是{a=3, b=3}。所以答案是 2,因为a的计数差为 1,b的计数差为 1。 -
在您的代码中,第一个字符串中的单个字符似乎可以匹配另一个字符串中的多个字符。您还将从正在迭代的字符串中删除字符,这会导致字符被跳过。
-
@user3386109 1) 我正在计算每个字符串中被删除的字符以及原始字符数。 2)这我知道 3)它如何导致字符被跳过以及可以做些什么来解决它?
标签: java algorithm data-structures stringbuilder anagram