49.字母异位词分组
给你一个字符串数组,请你将字母异位词组合在一起。可以按任意顺序返回结果列表。
字母异位词是由重新排列源单词的字母得到的一个新单词,所有源单词中的字母通常恰好只用一次。
示例1
输入: strs = ["eat", "tea", "tan", "ate", "nat", "bat"]
输出: [["bat"],["nat","tan"],["ate","eat","tea"]]
示例2
输入: strs = [""]
输出: [[""]]
示例3
输入: strs = ["a"]
输出: [["a"]]
提示
1 <= strs.length <= 10^4
0 <= strs[i].length <= 100
strs[i]
仅包含小写字母
思路
对于每一个单词,要统计每个字母出现次数的话会非常麻烦,因此可以使用sort函数把每个单词的字母都排序一下,这样排序后的单词就可以直接进行比较。如果再使用一个<string, vector< string >>的哈希表储存单词,就能比较方便地得到答案。步骤如下:
- 依次取出strs中的每个单词,用key表示;
- 使用sort函数将key排序,把排序后的key作为键值加入哈希表
- 在遍历完成strs后,逐个将哈希表中的数据注入数组
代码
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> res;
map<string,vector<string>> mp;
int n = strs.size();
for (int i = 0; i < n; i++){
string key = strs[i];
sort(key.begin(), key.end());
mp[key].push_back(strs[i]);
}
for (auto ite = mp.begin(); ite != mp.end(); ite++){
res.push_back(ite->second);
}
return res;
}
43.字符串相乘
给定两个以字符串形式表示的非负整数num1
和num2
,返回num1
和num2
的乘积,它们的乘积也表示为字符串形式。
注意:不能使用任何内置的 BigInteger 库或直接将输入转换为整数。
示例1
输入: num1 = "2", num2 = "3"
输出: "6"
示例2
输入: num1 = "123", num2 = "456"
输出: "56088"
提示
1 <= num1.length, num2.length <= 200
num1
和num2
只能由数字组成。num1
和num2
都不包含任何前导零,除了数字0本身。
思路
两数相乘的结果的位数,不会超过两数的位数相加。可以从尾部开始相乘,最后再用substr去掉前导0。这道题和之前的字符串相加其实类似,算法上没有什么难度,主要考察的是字符串,字符类型的数字不能直接相加和相乘,需要减去‘0’。
代码
string multiply(string num1, string num2) {
int m = num1.size();
int n = num2.size();
string s(n + m, '0');
for (int i = m - 1; i >= 0; i--){
for(int j = n - 1; j >= 0; j--){
int tmp = (s[i+j+1] - '0') + (num1[i] - '0')*(num2[j] - '0');
s[i + j + 1] = tmp % 10 + '0';
s[i + j] += tmp / 10;
}
}
for (int i = 0; i < m + n; i++){
if (s[i] != '0') return s.substr(i);
}
return "0";
}
本文题目及部分解答来自力扣:49.字母异位词分组和43.字符串相乘。