给出一个字符串数组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. JavaScript 中的数字和日期类型

    本章节介绍如何掌握Javascript里的数字和日期类型 数字EDIT 在 JavaScript 里面,数字都是双精度浮点类型的 double-precision 64-bit binary form ...

  2. 深入 JavaScript(6) - 一静一动

    这里是JavaScript核心的内容了. 挺多的JavaScript测试题也是围绕这个出的. 这里的一静一动指的是: 静, 词法作用域 - Lexical scoping 动, 动态绑定this的值 ...

  3. redis 异常排查

    异常排查 redis-server redis.windows.conf D:\redis-2.8.17>redis-server.exe redis.windows.conf[4692] 27 ...

  4. 回调函数的意义以及python实现

    因工作需要,最近在学习使用python来解析各种文件,包括xmind,xml,excel,csv等等. 在学习python解析XML的时候看到这样一段话: 3.ElementTree(元素树) Ele ...

  5. 联系我们_你我想法_【有男度】UNANDU 100%进口 全球设计师品牌精汇 男装_男装搭配_时尚男装_品牌男装_男装搭配技巧_男装网站

    联系我们_你我想法_[有男度]UNANDU 100%进口 全球设计师品牌精汇 男装_男装搭配_时尚男装_品牌男装_男装搭配技巧_男装网站 联系我们 2012-02-17   国内北京公司总部  邮编 ...

  6. N - Picture - poj 1177(扫描线求周长)

    题意:求周长的,把矩形先进行融合后的周长,包括内周长 分析:刚看的时候感觉会跟棘手,让人无从下手,不过学过扫描线之后相信就很简单了吧(扫描线的模板- -),还是不说了,下面是一精确图,可以拿来调试数据 ...

  7. JS浏览器对象-History对象

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. iOS 后台定位被拒注意事项

    iOS 后台定位被拒的原因很简单就是没有达到苹果对后台定位的要求. 本地要求: 1.在plist文件中添加字段 "Privacy - Location Always Usage Descri ...

  9. JAXB--学习1

    一.简介 JAXB(Java Architecture for XML Binding) 是一个业界的标准,是一项可以根据XML Schema产生Java类的技术.该过程中,JAXB也提供了将XML实 ...

  10. Selenium2(webdriver)入门之TestNG的使用

    一.在Eclipse中安装TestNG 1.打开eclipse-->help-->Install New Software-->Add,输入Name和Location后,点击OK. ...