每日算法之三十八:Anagrams
Given an array of strings, return all groups of strings that are anagrams.
Note: All inputs will be in lower-case.
回文字符串是指: 两个字符串的字符个数全然同样,这两个字符串是Anagrams。因此Anagrams至少指俩字符串。找出字符集合中的Anagrams组。
由此我们能够想到,仅仅要将几个单词依照字母顺序进行排序,就能够通过比較推断他们是否是anagrams。
思路:用map<string, int>记录排序后的字符串以及首次出现的位置。
1. 从strs的第一个元素開始遍历。首先对元素进行排序得到s;
2. 在map里查找s;
3. 若不存在,将s以及该元素的下标存入map<string ,int>;
4. 若存在,首先将第一次出现s时的原始字符串存入结果res,即strs[map[s]],并将map[s]设置为-1(防止下次再存),再将该字符串本身存入结果res。
5. 反复以上1-4步,直到遍历结束。
以下是代码:
<span style="font-size:14px;">class Solution {
public:
vector<string> anagrams(vector<string> &strs) {
vector<string> res;//作为最后的结果集返回
if(strs.size()<=1)//仅仅有一个是不可以成为回文字符串集的
return res;
map<string,int> anagram;//暂存排序之后的字符串,同一时候还有存储在strs中的位置
for(int i = 0;i<strs.size();i++)
{
string s = strs[i];
sort(s.begin(),s.end());
if(anagram.find(s) == anagram.end())//不存在缓存map中,就插入
anagram.insert(make_pair(s,i));
else
{
if(anagram[s]>=0)//排序之前的s没有被存储在res中。因此要存储,而且把标记为置为-1
{
res.push_back(strs[anagram[s]]);
anagram[s] = -1;
}
res.push_back(strs[i]);//仅仅要是在缓存中匹配的,就说明之前有匹配的回文串。加入到结果集中
}
}
return res;
}
};</span>
每日算法之三十八:Anagrams的更多相关文章
- 每日算法之三十四:Multiply Strings
大数相乘,分别都是用字符串表示的两个大数.求相乘之后的结果表示. 首先我们应该考虑一下測试用例会有哪些,先准备測试用例对防御性编程会有比較大的帮助.可以考虑一些极端情况.有以下几种用例: 1)&quo ...
- 每日算法之三十五:Wildcard Matching
模式匹配的实现,'?'代表单一字符,'*'代表随意多的字符.写代码实现两个字符串是否匹配. Implement wildcard pattern matching with support for ' ...
- VS2010/MFC编程入门之三十八(状态栏的使用详解)
上一节中鸡啄米讲了工具栏的创建.停靠与使用,本节来讲解状态栏的知识. 状态栏简介 状态栏相信大家在很多窗口中都能见到,它总是用来显示各种状态.状态栏实际上也是一个窗口,一般分为几个窗格,每个窗格分别用 ...
- 【管理心得之三十八】如果“Q”不是高富帅,也吸引不了白富美“A”
场景再现=========================={美剧片段}一位老人在电话亭中,一次又一次地向公用电话投硬币,但是每一次仅是接通后就自动掉线了.老人无奈之下寻求他人拨打报修电话,但苦等了许 ...
- 每日算法之三十三:Trapping Rain Water
这是一个非常有意思的问题,求解最大容积问题,值得动脑筋想一想. 原题例如以下: Given n non-negative integers representing an elevation map ...
- Java经典编程题50道之三十八
编写一个函数:输入n为偶数时,调用函数求1/2+1/4+...+1/n:当输入n为奇数时,调用函数1/1+1/3+...+1/n. public class Example38 { public ...
- ABP框架系列之三十八:(NHibernate-Integration-NHibernate-集成)
ASP.NET Boilerplate can work with any O/RM framework. It has built-in integration with NHibernate. T ...
- Android学习指南之三十八:Android手势操作编程[转]
手势操作在我们使用智能设备的过程中奉献了不一样的体验.Android开发中必然会进行手势操作方面的编程.那么它的原理是怎样的呢?我们如何进行手势操作编程呢? 手势操作原理 首先,在Android系统中 ...
- Android实战技巧之三十八:Handler使用中可能引发的内存泄漏
问题描写叙述 曾几何时,我们用原来的办法使用Handler时会有以下一段温馨的提示: This Handler class should be static or leaks might occur ...
随机推荐
- oracle for update和for update nowait(for update wait)的区别
1.for update 和 for update nowait 的区别: 1.oracle 中执行select 操作读取数据不会有任何限制,当另外一个进程在修改表中的数据,但是并没有commit,所 ...
- Git 在小团队中的管理流程(转)
目标读者:了解 Git 的基本概念,能够使用 Git 进行基本的本地和远程操作. 有关 Git 的基础知识可以参见 知乎回答-怎样使用 GitHub?,天猪(刘勇)给出了一些很好的学习资料. 本文介绍 ...
- netduino第一步,环境配置
在netduino.com的官网介绍下,我很快就入门,现在的最新netduino的版本是4.3,但4.3是运行在win8下的,在codeplex.net上有,大部分人还使用的是win7,因此我现在采用 ...
- 由href return false 来看阻止默认事件
很多时候我们都想阻止一个a ?link的href跳转. 1 <a onclick=” return false ;” href=”www. 360 .cn”>click</a> ...
- 炮塔郝梦主solo
尊重开发人员的工作,转载时请注明出处:http://blog.csdn.net/haomengzhu/article/details/31885287 或许你会由于它爱上dota: 或许你会由于它爱上 ...
- Swift - 多线程实现方式(1) - NSThread
1,Swift继续使用Object-C原有的一套线程,包括三种多线程编程技术: (1)NSThread (2)Cocoa NSOperation(NSOperation和NSOperationQueu ...
- delphi中一切皆指针
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Form ...
- 【Cocos2d-X游戏实战开发】捕鱼达人之单例对象的设计(二)
本系列学习教程使用的是cocos2d-x-2.1.4(最新版为cocos2d-x-2.1.5) 博主发现前两个系列的学习教程被严重抄袭,在这里呼吁大家请尊重开发者的劳动成果, 转载的时候请务必注 ...
- Windows 7如何建立一个FTP的快捷方式
原来,使用Windows XP的时候,在IE6的地址栏里输入FTP服务器的地址,就可以打开一个资源管理器的界面来管理文件.但是,随着IE的版本的提升或是装了Windows 7,原来的这种方法就不能用了 ...
- 积累的VC编程小技巧之工具条和状态条
1.工具条和状态条中控件的添加: 方法⑴.只能在ToolBar里创建控件:首先,在ToolBar中创建一个Button,其ID为ID_TOOL_COMBO(我们要将创建的控件放在该Button的位置上 ...