网站建设及维护流程,合肥市住房建设局网站,办公邮箱最常用的是什么邮箱,镇江企业宽带给定两个字符串 s 和 t #xff0c;编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s anagram, t nagaram 输出: true 示例 2: 输入: s rat, t car 输出: false
说明: 你可以假设字符串只包含小写字母。 …给定两个字符串 s 和 t 编写一个函数来判断 t 是否是 s 的字母异位词。 示例 1: 输入: s anagram, t nagaram 输出: true 示例 2: 输入: s rat, t car 输出: false
说明: 你可以假设字符串只包含小写字母。
思路 先看暴力的解法两层for循环同时还要记录字符是否重复出现很明显时间复杂度是 O(n^2)。 数组其实就是一个简单哈希表而且这道题目中字符串只有小写字符那么就可以定义一个数组来记录字符串s里字符出现的次数。 需要定义一个多大的数组呢定一个数组叫做record大小为26 就可以了初始化为0因为字符a到字符z的ASCII也是26个连续的数值。
为了方便举例判断一下字符串s aee, t eae。 定义一个数组叫做record用来上记录字符串s里字符出现的次数。 需要把字符映射到数组也就是哈希表的索引下标上因为字符a到字符z的ASCII是26个连续的数值所以字符a映射为下标0相应的字符z映射为下标25。 再遍历 字符串s的时候只需要将 s[i] - ‘a’ 所在的元素做1 操作即可并不需要记住字符a的ASCII只要求出一个相对数值就可以了。 这样就将字符串s中字符出现的次数统计出来了。 那看一下如何检查字符串t中是否出现了这些字符同样在遍历字符串t的时候对t中出现的字符映射哈希表索引上的数值再做-1的操作。 那么最后检查一下record数组如果有的元素不为零0说明字符串s和t一定是谁多了字符或者谁少了字符return false。 最后如果record数组所有元素都为零0说明字符串s和t是字母异位词return true。
时间复杂度为O(n)空间上因为定义是的一个常量大小的辅助数组所以空间复杂度为O(1)。
C 代码如下
class Solution {
public:bool isAnagram(string s, string t) {int hash[26] {0};for(int i 0; i s.size(); i){hash[s[i] - a];}for(int i 0; i t.size(); i){hash[t[i] - a]--;}for(int i 0; i 26; i){if(hash[i] ! 0){return false;}}return true;}
};
感谢carl哥