字母异位词(anagram)的不同复杂度实现
题目
这是一道微软的面试题,题目是这样的:两个单词如果包含相同的字母,次序不同,则称为字母易位词(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)的不同复杂度实现相关推荐
- C#LeetCode刷题之#242-有效的字母异位词(Valid Anagram)
问题 该文章的最新版本已迁移至个人博客[比特飞],单击链接 https://www.byteflying.com/archives/4040 访问. 给定两个字符串 s 和 t ,编写一个函数来判断 ...
- 【Leetcode047】有效的字母异位词
242.有效的字母异位词[简单] 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. ...
- 242. 有效的字母异位词-Java
242. 有效的字母异位词 题目概述 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词.注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词 ...
- LeetCode简单题之有效的字母异位词
题目 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 1: 输入: s = ...
- C#版 - Leetcode49 - 字母异位词分组 - 题解
C#版 - Leetcode49 - 字母异位词分组 - 题解 Leetcode49.Group Anagrams 在线提交: https://leetcode.com/problems/group- ...
- 1.字母异位词分组(LeetCode第49题)
一.题目描述 给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", " ...
- python 有效的字母异位词
| 有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词. 示例 1: ...
- LeetCode 49字母异位词分组50pow(x,n)51八皇后
原创公众号:bigsai 如果不错记得点赞收藏! 关注回复 bigsai 领取Java进阶pdf资源,回复进群加入力扣打卡群. 上周打卡内容:43字符串相乘&44通配符匹配 45跳跃游戏&am ...
- LeetCode-有效的字母异位词
题目描述: 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词. 输入: s = "anagram", t = "nagaram" ...
- 《每日一题》49. Group Anagrams 字母异位词分组
给定一个字符串数组,将字母异位词组合在一起.字母异位词指字母相同,但排列不同的字符串. 示例: 输入: ["eat", "tea", "tan&quo ...
最新文章
- PostgreSQL在何处处理 sql查询之二十一
- gdbserver yum 安装_(OK) 编译cBPM—CentOS7—gdb—gdbserver—成功—调试
- 如何12个月内成为数据科学家?
- /boot/grub/grub.conf文件详解
- ElementUI分页组件的封装
- C语言高级编程:预处理中的 # 和 ##
- python中读取指定的行和列_Python怎么获取excle中指定行和列的值?
- 【C语言】求s(n)=a+aa+aaa+...+aa...a的值
- 火山视频解析,火山视频去水印
- 程序员职场-三人行,必有我师
- Ubuntu社区及其论坛
- python Beautiful Soup解析html页面table标签
- 格力除了被美的遏制,还面临离职员工的挑战
- RSSI,RSRP,RSRQ and SINR
- imgbb图床API
- 在Flash中播放flv视频
- 【PHP代码注入】PHP代码注入漏洞
- linux 重启kettle服务_Linux下安装配置kettle的部署
- 精品源码素材资源网整站源码打包+数据2GB
- MySQL数据库——对Linux MySQL软件包的一些说明
热门文章
- Java Session对象的钝化和活化
- iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT --to-destinatio
- 手把手教你摆地摊之摆摊卖什么
- matlab 离散点求导_如何用matlab求离散型数值的导数
- 如何调节桌面亮度计算机,电脑屏幕亮度怎么调,教您调节电脑亮度方法
- 中国计算机学会推荐国际学术会议和期刊目录(2019,最新)
- 基于java的健身房管理系统的设计与实现
- 企业邮箱部署SSL证书
- SEO 基础知识遇上圣诞节
- Linux sed命令详解