题目
这是一道微软的面试题,题目是这样的:两个单词如果包含相同的字母,次序不同,则称为字母易位词(anagram)。例如,“silent”和“listen”是字母易位词,而“apple”和“aplee”不是易位词。请定义函数检查两个单词是否是字母易位词。可以假设两个单词字母均为小写。要求算法复杂度尽量低。
看到这个题目,你的第一想法是怎么做?
思路一
首先,最基本的思路,便是检测字符串s1中的字符是否都出现在s2中(在s1和s2长度一样的前提下)。为了解决“apple”和“aplee”不是易位词的这种情况,不能仅仅判断出现在s2中就可以了,还需要做个标记。将s2中已经和s1对应上的位置标记为0,C++实现如下:

bool anagramSolution1(string s1,string s2)
{if(s1.size()!=s2.size())return false;bool stillOk=true;for(int i=0;i<s1.size()&&stillOk;i++){bool found=false;for(int j=0;j<s2.size()&&!found;j++){if(s2[j]==s1[i]){s2[j]=0;found=true;}}if(found){stillOk=true;}else{stillOk=false;}}return stillOk;
} 

让我们考虑一下算法复杂度,对于s2中的每个元素,s1都会从头开始遍历一遍,所以算法的复杂度为O(n^2)。
可以想一想,有没有算法复杂度比这个更低的呢?
思路二
通过题目,我们可以想到,字母易位词即为各个字母的数目相同,而顺序不一致。因而,如果对字符串按照字母顺序排序后,那么两个字符串应该完全一致。这样算法复杂度是否更低?
C++实现如下:

bool anagramSolution2(string s1,string s2)
{if(s1.size()!=s2.size())return false;sort(s1.begin(),s1.end());sort(s2.begin(),s2.end());return s1==s2;
}

这个复杂度是多少呢,因为其中用到了排序算法(头文件包含algorithm)和s1、s2比较的算法。所以复杂度为O(n*logn)。比思路一的复杂度降低了。
思路三
思路二利用了字母易位词即为各个字母的数目相同,而顺序不一致。我们从另外一个角度思考,字母一共有多少个?很明显,只有26个(只考虑小写字母)。那么,我们可以为字符串s1和s2分别设置26个计数器,然后判断这对应位置的计数是否相等,如果对应计数完全相等,则为字母易位词。
C++实现如下:

bool anagramSolution3(string s1,string s2)
{if(s1.size()!=s2.size())return false;int count1[26]={0};int count2[26]={0};for(int i=0;i<s1.size();i++){count1[s1[i]-'a']+=1;}for(int j=0;j<s2.size();j++){count2[s2[j]-'a']+=1;}bool match=true;for(int idx=0;idx<26&&match;idx++){if(count1[idx]!=count2[idx]){match=false;}}return match;
}

算法的复杂度为O(n+n+26),即为O(n),为线性复杂度的算法。

字母异位词(anagram)的不同复杂度实现相关推荐

  1. C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)

    问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4040 访问. 给定两个字符串 s 和 t ,编写一个函数来判断 ...

  2. 【Leetcode047】有效的字母异位词

    242.有效的字母异位词[简单] 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. ...

  3. 242. 有效的字母异位词-Java

    242. 有效的字母异位词 题目概述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词 ...

  4. LeetCode简单题之有效的字母异位词

    题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 1: 输入: s = ...

  5. C#版 - Leetcode49 - 字母异位词分组 - 题解

    C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交: https://leetcode.com/problems/group- ...

  6. 1.字母异位词分组(LeetCode第49题)

    一.题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", " ...

  7. python 有效的字母异位词

    | 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 1: ...

  8. LeetCode 49字母异位词分组50pow(x,n)51八皇后

    原创公众号:bigsai 如果不错记得点赞收藏! 关注回复 bigsai 领取Java进阶pdf资源,回复进群加入力扣打卡群. 上周打卡内容:43字符串相乘&44通配符匹配 45跳跃游戏&am ...

  9. LeetCode-有效的字母异位词

    题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 输入: s = "anagram", t = "nagaram" ...

  10. 《每日一题》49. Group Anagrams 字母异位词分组

    给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...

最新文章

  1. PostgreSQL在何处处理 sql查询之二十一
  2. gdbserver yum 安装_(OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试
  3. 如何12个月内成为数据科学家?
  4. /boot/grub/grub.conf文件详解
  5. ElementUI分页组件的封装
  6. C语言高级编程:预处理中的 # 和 ##
  7. python中读取指定的行和列_Python怎么获取excle中指定行和列的值?
  8. 【C语言】求s(n)=a+aa+aaa+...+aa...a的值
  9. 火山视频解析,火山视频去水印
  10. 程序员职场-三人行,必有我师
  11. Ubuntu社区及其论坛
  12. python Beautiful Soup解析html页面table标签
  13. 格力除了被美的遏制,还面临离职员工的挑战
  14. RSSI,RSRP,RSRQ and SINR
  15. imgbb图床API
  16. 在Flash中播放flv视频
  17. 【PHP代码注入】PHP代码注入漏洞
  18. linux 重启kettle服务_Linux下安装配置kettle的部署
  19. 精品源码素材资源网整站源码打包+数据2GB
  20. MySQL数据库——对Linux MySQL软件包的一些说明

热门文章

  1. Java Session对象的钝化和活化
  2. iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destinatio
  3. 手把手教你摆地摊之摆摊卖什么
  4. matlab 离散点求导_如何用matlab求离散型数值的导数
  5. 如何调节桌面亮度计算机,电脑屏幕亮度怎么调,教您调节电脑亮度方法
  6. 中国计算机学会推荐国际学术会议和期刊目录(2019,最新)
  7. 基于java的健身房管理系统的设计与实现
  8. 企业邮箱部署SSL证书
  9. SEO 基础知识遇上圣诞节
  10. Linux sed命令详解