题目描述
给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的字母异位词。注意:若 s 和 t 中每个字符出现的次数都相同,则称 s 和 t 互为字母异位词。示例 1 :
输入: s = "anagram" , t = "nagaram"
输出: true 示例 2 :
输入: s = "rat" , t = "car"
输出: false
思路
检查字符串长度: 函数首先检查两个字符串 s 和 t 的长度是否相同。如果长度不相等,直接返回 false,因为长度不同的字符串不可能是字母异位词。 初始化哈希表: 使用一个固定大小为26的整型数组 hash 来存储每个字母的频率。数组的每个位置对应一个字母(‘a’ 到 ‘z’),初始值设为0。 填充哈希表: 遍历字符串 s,对于 s 中的每个字符,通过 s[i] - ‘a’ 计算其在 hash 数组中的索引,并将对应的值增加1。 修改哈希表以匹配第二个字符串: 遍历字符串 t,同样计算每个字符在 hash 数组中的索引,但这次将对应的值减少1。这样做的目的是抵消之前对 s 字符的计数,从而检测 t 是否有额外的或缺失的字符。 检查哈希表的所有值: 遍历 hash 数组,如果数组中的任何一个值不为0,则意味着至少有一个字符在两个字符串中出现的次数不同。如果发现这样的情况,返回 false。 返回结果: 如果所有检查都未发现问题,最后返回 true,表示两个字符串是字母异位词。
完整代码
# include <iostream>
# include <string>
using namespace std; class Solution {
public : bool isAnagram ( string s, string t) { if ( s. size ( ) != t. size ( ) ) return false ; 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 ; }
} ; int main ( )
{ Solution s; string str1 = "aee" ; string str2 = "eae" ; cout << s. isAnagram ( str1, str2) << endl; return 0 ;
}