讲解Leetcode第242题:有效的字母异位词
题目介绍
输入:s=“anagram”,t=“nagaram”
输出:true
解释:字符串s和t由相同的字符组成,但是字符出现的顺序不同,故字符串s和t互为字母异位词
方法—:排序
完整代码展示
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;
class Solution
{
public:
bool isAnagram(string s, string t)
{
if (s.length() != t.length())
{
return false;
}
else
{
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return s == t;
}
}
};
int main()
{
string s = "aabc", t = "acba";
Solution judge;
bool result = judge.isAnagram(s, t);
if (result)
{
cout << "s和t互为字母异位词" << endl;
}
else
{
cout << "s和t不互为字母异位词" << endl;
}
return 0;
}
代码片段解释
片段—:
#include <string>
#include <algorithm>
- string头文件是C++标准库的一部分,它定义了一个string类,这是一个用于处理字符串的模板类。
通过使用string你可以方便地对字符串进行操作,而不需要手动管理字符串的内存。
- algorithm头文件也是C++标准库的一部分,他提供了一系列通用的模板函数(算法函数)。
这些函数可以对容器中的元素进行操作。
片段二:
if (s.length() != t.length())
sort(s.begin(), s.end());
s.length()
返回字符串s的长度。 (即s中包含的字符数)
s.begin()
返回一个指向字符串s的第一个字符的迭代器。(返回的迭代器也可以被视为指向s[0]的指针)
s.end()
返回一个指向字符串s的“尾后”位置的迭代器。 (这是一个不存在的虚假位置,指向最后一个字符之后的位置)
片段三:
return s == t;
使用
==运算符
来比较字符串s、t是否相等,相等返回true,不相等返回false。
方法二:哈希表
完整代码展示
#include<iostream>
#include<vector>
#include <string>
using namespace std;
class Solution
{
public:
bool isAnagram(string s, string t)
{
if (s.length() != t.length())
{
return false;
}
else
{
vector<int>table(26, 0);
for (auto& ch : s)
{
table[ch - 'a']++;
}
for (auto& ch : t)
{
table[ch - 'a']--;
if (table[ch - 'a'] < 0)
{
return false;
}
}
return true;
}
}
};
int main()
{
string s = "aabc", t = "acba";
Solution judge;
bool result = judge.isAnagram(s, t);
if (result)
{
cout << "s和t是字母异位词" << endl;
}
else
{
cout << "s和t不是字母异位词" << endl;
}
return 0;
}
核心原理演示
输入:s=“aabc”,t=“acba”
输出:true
代码片段解释
片段—:
vector<int>table(26, 0);
语法:这里创建了一个整型向量容器table,创建的同时并对其进行初始化:
用26个数字0进行初始化
目的:用于记录26个小写字母在字符串s中出现的次数。
片段二:
for (auto& ch : s)
for (auto& ch : t)
auto& ch
:表示自动推断变量ch的类型。
for(declaration : container) { //循环体 }
这是C++11中引入的
基于范围的for循环
。这种循环方式可以简洁地遍历容器中的所有元素。
- declaration:定义了一个变量,该变量在每次循环中都会被赋予容器的下一个元素。
- container:要遍历的容器,它可以是任何提供了begin()和end()方法的容器。
故,for (auto& ch : s)与for (auto& ch : t)分别用于遍历字符串s和t中的每一个字符。
补充基于范围的for循环的其他语法形式
:
- 值语义:
for (auto& element : container) { // 使用引用避免拷贝 }
- 常量型:
for (const auto& element : container) { //不能修改element,因为它是const引用 }
片段三:
table[ch - 'a']++;
table[ch - 'a']--;
将字符串s,t中的每一个字符映射的向量容器中,即数组中:
ch - 'a'
作为数组的索引。table[ch - 'a']
作为数组的值。