【问题标题】:anagram checker not passing all test cases?字谜检查器没有通过所有测试用例?
【发布时间】:2023-03-22 09:45:01
【问题描述】:

我正在做一个在线代码挑战,要求编写一个字谜检查程序。所以我做了以下程序,由于一些奇怪的原因它没有通过所有的测试用例。我自己编写了一个 main 函数并尝试自己测试它,它似乎工作正常。

#include<iostream>


using namespace std;

bool anagrams(string str1, string str2);

int main(){
    string str1="abcd";
    string str2="dcba";

    cout<<anagrams(str1,str2)<<endl;
    cin.get();
    return 0;    
}

bool anagrams(string str1, string str2){
    if(str1.length()!=str2.length()) return false;
    for(int i=0;i <str1.length(); i++){
        for(int j=0;j<str2.length();j++){
            if(str1[i]==str2[j]){
                str1[i]='*';
                break;
            }
        }    
    }
    for(int i=0;i<str1.length();i++){
        if(str1[i]!='*') return false;
    }
    return true;
}

【问题讨论】:

    标签: string anagram


    【解决方案1】:

    您的代码似乎在检查 str1 中的字符是否存在于 str2 中。

    例如,如果 str1="abca" 和 str2="abcd" 它们显然不是字谜。
    但是它不会将 str1 变成“****”,因为它会将 str1 中的最后一个 a 与 str2 中的第一个 a 匹配(两次)。

    【讨论】:

      【解决方案2】:

      好的,所以程序不能处理诸如

      之类的输入
      abcc
      abcd
      

      因此,当您遍历str1 中的每个字符时,快速解决方法是将str2 中的字符标记为*

      #include<iostream>
      
      
      using namespace std;
      
      bool anagrams(string str1, string str2);
      
      int main(){
          string str1="abcc";
          string str2="dcba";
      
          cout<<anagrams(str1,str2)<<endl;
          cin.get();
          return 0;    
      }
      
      bool anagrams(string str1, string str2){
          if(str1.length()!=str2.length()) return false;
          for(int i=0;i <str1.length(); i++){
              for(int j=0;j<str2.length();j++){
                  if(str1[i]==str2[j]){
                      str2[j]='*';
                      break;
                  }
              }    
          }
          for(int i=0;i<str2.length();i++){
              if(str2[i]!='*') return false;
          }
          return true;
      }
      

      对于字谜检查器有更好的算法,例如排序和使用哈希。

      【讨论】:

      • 其实只需要标记目标字符串str2,因为源字符串str1是隐式标记的,因为在外for中没有使用两次字母。然后只为所有*s 检查str2
      【解决方案3】:
      package com.datastructures.programs;
      
      public class Anagram {
      
          public static void main(String[] args) {
              // TODO Auto-generated method stub
      
              String s1 = "abcc";
              String s2 = "abcd";
      
              System.out.println(Anagram.isAnagram(s1, s2));
          }
      
          private static boolean isAnagram(String s1, String s2) {
              // TODO Auto-generated method stub
      
              int[] temp = new int[256];
              boolean isAnagram = true;
              if (s1.length() != s2.length()) {
                  return false;
              }
      
              for (char s : s1.toCharArray()) {
                  int index = (int) s;
                  temp[index]++;
              }
              for (char s : s2.toCharArray()) {
                  int index = (int) s;
                  temp[index]--;
              }
              for (int i = 0; i < 256; i++) {
                  if (temp[i] != 0) {
                      return false;
                  }
              }
              return true;
          }
      
      }
      

      【讨论】:

      • 欢迎来到 Stack Overflow!虽然这段代码可以解决问题,including an explanation 解决问题的方式和原因确实有助于提高帖子的质量(尤其是当您似乎使用与问题中使用的编程语言不同的编程语言时)。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的答案添加解释并说明适用的限制和假设。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-29
      • 2021-09-25
      • 1970-01-01
      • 1970-01-01
      • 2019-03-11
      • 1970-01-01
      相关资源
      最近更新 更多