LeetCode49————字母异位词分组

题目描述:

给定一个字符串数组,将字母异位词组合在一起,字母异位词指字母相同,但排列不同的字符串。

示例:

输入:
["eat","tea","tan","ate","nat","bat"]
输出:
[
    ["ate","eat","tea"],
    ["nat","tan"],
    ["bat"]
]

说明:

1.所有输入均为小写字母

2.不考虑答案输出的顺序。

解析过程:

这道题关键的地方就是如何能够将 字母异位词 找出来???

方式一:一共有26个字母,然后每出现的单词的比较标准就是单词的组成字母的乘积值,那么用哪些数字能够保证字母异位词的标准值相同,我们选用的是26个素数,这样我们就确保了,字母异位词的标准值必定一样,并且不是字母异位词的标准值必定不相同。

方式二:观察字母异位词 team 和 atem 之间会有什么联系呢?很显然他们出字母的顺序不一样,其他的都一致,那么我们是否可以通过给他们排序来确定他们是不是字母异位词呢???很明显这是可以的。。

 

详细代码:

#include
using namespace std;
#include
#include

class Solution{
public:
    vector>groupAnarams(vector& strs){
        vector>res;//用于接受结果的临时变量
        map> M;//map存放表
        for(int i = 0;i< strs.size();++i)
        {
            string key = strs[i];//key作为临时变量进行操作的
            sort(key.begin(),key.end());//对key这个词进行排序
            M[key].push_back(strs[i]);//通过key作为索引,进行二维数组的插入
        }
        for(auto ite = M.begin();ite != M.end();++ite)
        {
            res.push_back(ite->second);
        }
        return res;
    }
}



        

auto在for中的用法:

1.auto的使用说明

C++11引入了auto类型说明符,auto让编译器通过初始值来推算变量的类型,所以auto定义的变量必须有初始值。

使用auto也就能在一条语句中声名多个变量,因为一条声名语句只能有一个基本数据类型,所以该语句中所有变量的初始基本数据都必须一样。

eg
auto i = 0,*p = &i;//正确
auto sz = 0,pi = 3.14;//错误 sz和pi的类型不一样。

2.auto和for的结合

范围for循环,便历给定序列中的每个元素并对序列中的每个值执行某种操作。

for(declaration:expression)
    statement

expression部分是一个对象,用于表示一个序列,declaration部分负责定义一个变量,该变量被用于访问序列中的基础 元素,每次迭代declaration部分的变量会被初始化为expression的下一个元素值。

3.两种使用方式

string s("hello,world");
decltype(s.size())punct_cnt = 0;//decltype也是C++11的特性,用于选择和返回操作数的数据类型
for(auto c:s)//对于变量中的字符
    ++punct_cnt;










string  s("hello,world");
for(auto& c:s)//对于s中的每个字符,c是一个引用,赋值语句会改变s中字符的值
    c = toupper(c);
cout<

 

你可能感兴趣的:(编程)