CTCI 制作字谜 - 得到不正确的输出

Posted

技术标签:

【中文标题】CTCI 制作字谜 - 得到不正确的输出【英文标题】:CTCI Making Anagrams - Getting incorrect output 【发布时间】: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

【问题讨论】:

在最后一个示例中,如果您删除 sh,则剩下“owman”和“woman”。这些是彼此的字谜。这就是为什么答案是 2。 是的,我知道。更困惑为什么我的方法没有返回 2。 您需要对每个字符串中的每个字符进行计数,然后比较计数。例如,如果第一个字符串是“aabbaa”,第二个字符串是“bbbaaa”,那么第一个字符串的计数是a=4, b=2,第二个字符串的计数是a=3, b=3。所以答案是 2,因为 a 的计数差为 1,b 的计数差为 1。 在您的代码中,第一个字符串中的单个字符似乎可以匹配另一个字符串中的多个字符。您还将从正在迭代的字符串中删除字符,这会导致字符被跳过。 @user3386109 1) 我正在计算每个字符串中被删除的字符以及原始字符数。 2)这我知道 3)它如何导致字符被跳过以及可以做些什么来解决它? 【参考方案1】:

您不需要使用在较大字符串的情况下成本更高的子字符串。您可以使用以下算法。我建议命名为 checkAnagram 而不是 makeAnagram

string_counter_map = 
for char in string1:
    if char in string_counter_map:
        string_counter_map[char] += 1
 for char in string2:
    if char in string_counter_map:
        string_counter_map[char] -= 1
    else:
        string_counter_map[char] = 1

假设如果所有字符 string_counter_map 都包含零,则它是字谜,否则不会。

【讨论】:

以上是关于CTCI 制作字谜 - 得到不正确的输出的主要内容,如果未能解决你的问题,请参考以下文章

如何将输入输出为每个辅音之间带有元音的字谜?

比较字谜字符串时输出错误

是两个字谜吗? [关闭]

使用递归函数解码字谜不会给出预期的输出

从矩形中提取文本时的 ItextSharp anagram 输出

将所有字谜组合在一起[关闭]