给出一个字符串数组S,找到其中所有的乱序字符串(Anagram)。如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中。

注意事项

所有的字符串都只包含小写字母

 
样例

对于字符串数组 ["lint","intl","inlt","code"]

返回 ["lint","inlt","intl"]

标签

第一次尝试解决,方法复杂,且不能通过。代码如下:

class Solution {
public:
/**
* @param strs: A list of strings
* @return: A list of strings
*/
vector<string> anagrams(vector<string> &strs) {//vector<string> s; //定义个一个字符串容器s
// write your code here //先考虑边界情况,如果字符串数组s中的所有字符串,都不等长,则不存在乱序字符串;
for(int i=;i<strs.size();i++){
int a[i]=strs[i].size();
}
for(int j=;j<strs.size()-;j++){
for(int k=j+;k<strs.size();k++){
if(a[j]>&&a[k]>&&a[j]==a[k]){
vector<string> s;
s.push_back(strs[j]);
strs[j]=" ";
s.push_back(strs[k]);
}
else{
return null;
}
}
}
int letters[s.size()][];
memset(letters,,letters);
for (int m=;m<s.size();m++){
string ll;
ll=s[i];
for(n=;n<ll.size();n++){
letters[m][ll[n]-'a']++;
}
} vector<string> t;
for (int a=;a<s.size()-;a++){
for(int b=a+;b<s.size();b++){
for(int c=;c<;){
if (letters[a][c]==letters[b][c])
{
c=c+;
}
else{
continue;
}
}
t.push_back(s[a]);
s[a]=" ";
t.push_back(s[b]);
}
return t;
}
};

二次参考:http://blog.csdn.net/wangyuquanliuli/article/details/45792029

解决思路很简单:对每个字符串进行排序,然后用hash表记录个数就行

class Solution {
public:
/**
* @param strs: A list of strings
* @return: A list of strings
*/
vector<string> anagrams(vector<string> &strs) {//vector<string> s; 定义个一个字符串容器s
// write your code here
//分析:对每个字符串进行排序,然后用hash表记录个数就行 map<string,int> m; //定义一个关联容器(hash表),提供一对一的数据处理能力。初始值为0;
for(auto s:strs) //s与strs[i]属于同种类型,也就是说,都是字符串,从第一个字符串到最后一个字符串;
{
sort(s.begin(),s.end()); //对字符串数组中的每个字符串进行排序
m[s]++; //将排序后的s,他的值加1,但这个排序不影响strs本身,只作用于for里面。
}
vector<string> ret; //定义一个字符串容器
for(auto s:strs)
{
auto temp = s;
sort(temp.begin(),temp.end()); //将每个字符串排序,如果排序之后,发现最后的m[temp]值大于1,则说明是乱序。
if(m[temp]>)
ret.push_back(s); //把乱序的字符串放到容器中,这样遍历每个字符串,就可以得到最终的结果。
}
return ret;
}
};

1. 关于字符串容器的定义和操作:

vector<string> vec;//定义个一个字符串容器,相当于字符串数组;
string str;
str = "abc";
vec.push_back(str);//把字符串str压进容器,必须使用push_back()动态添加新元素
vec.push_back("def");//把字符串"def"压进容器
vec.push_back("123");
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<endl;//打印容器的内容
}
vec.pop_back();//取出容器中最后一个
for(int i=0; i<vec.size(); i++)
{
cout<<vec[i]<<endl;//打印容器的内容
}

若要一次性初始化,如下:

vec.resize(4,"abc"); //一次性有4个abc

2. 字符串相关:

【s.size()函数返回字符串s中的字符个数;s.empty()用来确认字符串s是否为空;】

【string类型拼接符"+"必须与一个string类型相邻 ,不能在两侧都是字符串常量】

注:关于hash表与HashMap原理,区别以及实现在面试中频繁出现,需要深刻理解。

3. hash表原理参考 (1). http://www.cnblogs.com/dolphin0520/archive/2012/09/28/2700000.html

(2). http://blog.chinaunix.net/uid-24951403-id-2212565.html

(3). http://kb.cnblogs.com/page/189480/

4. HashMap原理参考 (1). http://blog.csdn.net/vking_wang/article/details/14166593#t0

(2). http://my.oschina.net/boxizen/blog/177744

Map的详细用法:   http://blog.csdn.net/sunshinewave/article/details/8067862

Lintcode--003(乱序字符串)的更多相关文章

  1. lintcode:anagrams 乱序字符串

    题目 乱序字符串 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 您在真实的面试中是否遇到过这个 ...

  2. 乱序字符串anagrams

    [抄题]: 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 对于字符串数组 ["lin ...

  3. 760. Find Anagram Mappings乱序字符串的坐标位置

    [抄题]: Given two lists Aand B, and B is an anagram of A. B is an anagram of A means B is made by rand ...

  4. LintCode-乱序字符串

    题目描述: 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 注意事项 所有的字符串都只包含小写字 ...

  5. VC6.0 多线程输出乱序问题

    今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream&g ...

  6. lintcode-171-乱序字符串

    171-乱序字符串 给出一个字符串数组S,找到其中所有的乱序字符串(Anagram).如果一个字符串是乱序字符串,那么他存在一个字母集合相同,但顺序不同的字符串也在S中. 注意事项 所有的字符串都只包 ...

  7. 【转】文件中有10G个整数,乱序排列,要求找出中位数

    题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数.内存限制为 2G.只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存). ...

  8. c#几种随机数组和数组乱序

    相关资料MSDN:RNGCryptoServiceProvider   Random   Guid private static RNGCryptoServiceProvider rngCsp = n ...

  9. [Android Security] APK自我保护 - 代码乱序

    cp : https://segmentfault.com/a/1190000005095406 乱序原理 为了增加逆向分析的难度,可以将原有代码在 smali 格式上进行乱序处理同时又不会影响程序的 ...

随机推荐

  1. [认知]ClassLoader 认知一二三

    曾经深入了解过ClassLoader,但一直没有时间去总结,现在以参考+自我认识的方式总结一下ClassLoader的相关内容,不能保证100%全,但目前对于一个毛头孩子来说,enough! 首先就要 ...

  2. CF-Mr. Kitayuta's Colorful Graph

    B. Mr. Kitayuta's Colorful Graph time limit per test 1 second memory limit per test 256 megabytes in ...

  3. You should rebuild using libgmp >= 5 to avoid timing attack vulnerability.", PowmInsecureWarning

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAApcAAAB3CAIAAADZ1fxtAAAbFElEQVR4nO2dzbHDOo6FHY9S0WqqZt

  4. 你应该了解的 7个Linux ls 命令技巧

    在前面我们系列报道的两篇文章中,我们已经涵盖了关于‘ls’命令的绝大多数内容.本文时‘ls命令’系列的最后一部分.如果你还没有读过该系列的其它两篇文章,你可以访问下面的链接. 15 个‘ls’命令的面 ...

  5. CentOS下MySQL无法正常启动错误

    一.非正常关机/退出MySQL时报错:/var/lib/mysql/mysql.sock 1.重启机器:shutdown -h now 2.删除或重命名:rm -r /var/lib/mysql/my ...

  6. 【KMP】Cyclic Nacklace

    KMP算法 next[]深入了解,做到这题才真正明白next[]的用法,希望后面的题目能理解的更深刻. Problem Description CC always becomes very depre ...

  7. 使用FastClick的同时造成元素上的trigger('click')无法触发的解决办法

    现象还原: 1. 初始化进入多规格卖场商详页的时候,chrome模拟器切换到安卓环境下,点击加入购物车,规格弹出页没有展示.而在PC和IOS模拟器下,可以弹出规格页 2. 点击加入购物车时,使用 $( ...

  8. openwrt上网配置的一些理解(四)

    这次要解决的问题是3g上网和wan口上往可以随意切换,当然能够叠加也是好事,不过这不是我关心的.下面还是修改3个文件network,firewall,multiwan.首先在network中加入界面配 ...

  9. 苹果的HomeKit协议

    苹果的HomeKit协议非常底层,其作用仅限于让iOS平台和家居设备能够相互“握手”,但“认识”之后,想要继续控制灯.空调等设备,仍然需要家电厂商在HomeKit的基础上进行二次开发.

  10. Windows 右键快速运行命令行

    原文见:右键命令行 - yacper - 博客园 方法一:配置文件夹选项 1 打开人任意文件夹,[工具] --> [文件夹选项] --> [文件类型] --> [(无)资料夹] -- ...