计数最低号码.char.从两个字符串中删除以使它们成为字眼

Counting minimum no. of char. to delete from two strings to make them anagrams

本文关键字:删除 字符串 两个 号码 char      更新时间:2023-10-16

我已经写下以下功能以返回否。从两个字符串中删除的字符以使其成为字符。

  int number_needed(string a, string b) {
  static int c;
  for(int i=0;i<=a.length();i++)    //loop over string a
      { char ch=a[i];
         int found=b.find(ch);
         if( found==string::npos)   //if character at a[i] not found in b
            {
              a.erase(i,1);          //delete character in a[i]
              c++;                   //inc. count c
            }
      }
  for(int i=0;i<=b.length();i++)       // repeat above looping for b string
      { char ch=b[i];
        int found=a.find(ch);
        if( found==std::string::npos)
           {
             b.erase(i,1);
             c++;
           }
      }
   return c;                           //finaly return no. of char. deleted
 }

我想知道我是否做得正确,以及我的想法在问题的背景下是否还好。另外,您能否让我理解以下有关解决方案的问题的代码。

 int number_needed(string a, string b) {
 auto count = 0;
 vector<int> freq(26, 0);
 for (auto c : a) { ++freq[c - 'a']; }
 for (auto c : b) { --freq[c - 'a']; }
 for (auto val : freq) { count += abs(val); }
 return count;
 }

回答有关主题的第二部分:

 vector<int> freq(26, 0);

该向量将保留字符串中字母的出现数量。

for (auto c : a) { ++freq[c - 'a']; }

通过字母浏览弦乐。如果您不熟悉for语法Google的新内容,则基本上意味着foreach letter c in string aauto零件告诉编译器从迭代的内容中推断迭代器的类型 - 在这种情况下,字符串a

c-'a'将字母转换为索引。所有字母连续出现在ASCII char表中(char to int映射到int),因此删除第一个字母" a",将其更改为0到26之间的索引。请注意,这仅适用于低案例字母:'a'-'a'= 0, 'b'-'a = 1等转换为整数时。因此,我们每当看到字符中的字母中的字母出现,每当我们看到字母中的出现。

for (auto c : b) { --freq[c - 'a']; }

在第二个字符串上执行相同的操作,这次删除了频率。如果字母在a中出现更多的次,则该字母的freq将是正量过剩的,如果在b中出现更多的情况,则具有适当的过量。

 for (auto val : freq) { count += abs(val); }

总结过量的 - 绝对值处理b的负多余。

正如GreatContini所注意到的那样,您不保留重复的计数。