【LeetCode & 剑指offer 刷题笔记】目录(持续更新中...)
242. Valid Anagram (变位词)
Given two strings
s
and
t
, write a function to determine if
t
is an anagram of
s
.
Example 1:
Input:
s
= "anagram",
t
= "nagaram"
Output:
true
Example 2:
Input:
s
= "rat",
t
= "car"
Output:
false
Note:
You may assume the string contains
only lowercase alphabets
.
Follow up:
What if the inputs contain unicode characters? How would you adapt your solution to such case?
//问题:字谜/变位词(判断某个字符串是否可以组合成某一个单词,假设只有小写)
/*
方法一:排序之后看是否一样
性能:O(nlogn) O(1)
*/
/*using namespace std;
#include <string>
#include <algorithm>
class Solution
{
public:
bool isAnagram(string s, string t)
{
sort(s.begin(), s.end());
sort(t.begin(), t.end());
return (s==t);
}
};*/
// if(s.find(t) != string::npos) return true; //查找是否有某个子串,不行,因为可能顺序不一样
// else return false;
/*
方法二:统计表法(这里可以直接用数组统计)
延伸:如果key值分布较散,比如包含unicode字符,可以考虑用hash表,
性能:O(n) O(1)
*/
using
namespace
std
;
#include <string>
#include <algorithm>
class
Solution
{
public
:
bool
isAnagram
(
string s
,
string t
)
{
if
(
s
.
size
()
!=
t
.
size
())
return
false
;
int
counter
[
26
]
=
{
0
};
//26个小写英文字母
for
(
int
i
=
0
;
i
<
s
.
size
();
i
++)
{
counter
[
s
[
i
]-
'a'
]++;
//也可用两个统计表分别统计,最后比较两个统计表是否相等
counter
[
t
[
i
]-
'a'
]--;
}
for
(
int
count
:
counter
)
{
if
(
count
!=
0
)
return
false
;
}
return
true
;
}
};
49
.
Group Anagrams
Given an array of strings, group anagrams together.
Example:
Input:
["eat", "tea", "tan", "ate", "nat", "bat"]
,
Output:
[
["ate","eat","tea"],
["nat","tan"],
["bat"]
]
Note:
-
All inputs will be in lowercase.
-
The order of your output does not matter.
//输出字谜组(这里字谜表示通过变序可以组成一个单词的字符串)
//相关题目:Valid Anagram
/*
方法一:用hash表map实现,key--->value为string--->vector<string>
如:"aer": ["are", "ear", "era"]
O(nklogk),O(nk),n为strs的长度,K为strs里字符串的最大长度
*/
#include <unordered_map>
#include <string>
class
Solution
{
public
:
vector
<
vector
<
string
>>
groupAnagrams
(
vector
<
string
>&
strs
)
{
unordered_map
<
string
,
vector
<
string
>>
mp
;
for
(
string s
:
strs
)
{
string t
=
s
;
sort
(t.begin(), t.end()); //key值,字谜单词排序后key值相同
mp
[
t
].
push_back
(
s
);
//当前key值添加value
}
vector
<
vector
<
string
>>
res
;
for
(
auto
&
m
:
mp
)
//将map中value全部push到结果向量中
{
res
.
push_back
(
m.second
);
//用.second访问map中的键值
}
return
res
;
}
};
/*
方法二:用统计表法实现,用单词的统计表(可以用vector,长度为26)作为key值
如:[2,1,0,0,...,0]: ["are", "ear", "era"]
O(nk),O(nk),n为strs的长度,K为strs里字符串的最大长度
general sort takes O(nlogn) time. In this problem, since the string only contains lower-case alphabets, we can write a sorting function using counting sort (O(n) time) to speed up the sorting process.
*/
class
Solution
{
public
:
vector
<
vector
<
string
>>
groupAnagrams
(
vector
<
string
>&
strs
)
{
unordered_map
<
string
,
multiset
<
string
>>
mp
;
for
(
string s
:
strs
)
{
string t
= strSort(s);
mp
[
t
].
insert
(
s
);
}
vector
<
vector
<
string
>>
anagrams
;
for
(
auto
m
:
mp
)
{
vector
<
string
>
anagram
(
m
.
second
.
begin
(),
m
.
second
.
end
());
anagrams
.
push_back
(
anagram
);
}
return
anagrams
;
}
private
:
string strSort
(
string
&
s
)
{
int
count
[
26
]
=
{
0
},
n
=
s
.
length
();
for
(
int
i
=
0
;
i
<
n
;
i
++)
count
[
s
[
i
]
-
'a'
]++;
//相当于计数排序
int
p
=
0
;
string t
(
n
,
'a'
);
for
(
int
j
=
0
;
j
<
26
;
j
++) //将“直方图”摊开,j代表某个字母,count[j]代表该字母的个数
for
(
int
i
=
0
;
i
<
count
[
j
];
i
++)
t
[
p
++]
+=
j
;
return
t
;
}
};