c++ - 使用 C++ 检查两个字符串是否是变位词

标签 c++ string char anagram

我想出下面的程序来检查两个字符串是否是变位词。它适用于小字符串但适用于较大的字符串(我试过:听过,入伍)它给了我一个“不!”

帮助!

#include<iostream.h> 
#include<string.h>
#include<stdio.h>

int main()
{
    char str1[100], str2[100];
    gets(str1);
    gets(str2);
    int i,j;
    int n1=strlen(str1);
    int n2=strlen(str2);
    int c=0;
    if(n1!=n2)
    {
          cout<<"\nThey are not anagrams ! ";
          return 0;
    }
    else 
    {
         for(i=0;i<n1;i++)
             for(j=0;j<n2;j++)
                 if(str1[i]==str2[j])
                     ++c;
    }
    if(c==n1)
        cout<<"yes ! anagram !! ";
    else 
        cout<<"no ! ";

    system("pause");
    return 0;
}

最佳答案

我很懒,所以我会使用标准库功能对两个字符串进行排序,然后比较它们:

#include <string>
#include <algorithm>

bool is_anagram(std::string s1, std::string s2)
{
  std::sort(s1.begin(), s1.end());
  std::sort(s2.begin(), s2.end());
  return s1 == s2;
}

一个小的优化可能是在排序之前检查字符串的大小是否相同。

但是如果这个算法被证明是一个瓶颈,我会暂时摆脱一些懒惰并将它与一个简单的计数解决方案进行比较:

  1. 比较字符串长度
  2. 实例化计数图,std::unordered_map<char, unsigned int> m
  3. 循环 s1 ,增加每个 char 的计数.
  4. 循环 s2 ,递减每个 char 的计数, 然后检查计数是否为 0

关于c++ - 使用 C++ 检查两个字符串是否是变位词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18267407/

相关文章:

Ruby:如何计算字符串开头和结尾的空格数?

c++ - 将字符串拆分为字符,然后返回字符串

c++ - 如何访问 C++ 中一行中间的字符?

c# - C#中如何取回子字符串的值

插入节点时实现树的 C++ 程序停止工作,我不明白为什么

sql - 自动截断分配的字符串到字段的长度?

c++ - 使用整数文字初始化 char 数组和 char 的区别

检查数组索引是数字还是字母?

c++ - 打开 g++ 优化会导致段错误 - 我不明白

c++ - 使用私有(private)构造函数的程序出错