乱序字符串

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

样例:对于字符串数组 ["lint","intl","inlt","code"],返回 ["lint","inlt","intl"]

还是使用哈希表。对于每个字符串出现的字符构成键,所在的索引构成值。这样,所有值中不止一个的,就构成了乱序字符串。

上面话说的不是很清楚。我们来看样例,首先设计键的结构:键的要求是要能表达清楚这个字符串中所有的字符,同时还要能与其他的乱序字符串直接对比。很容易想到set,但是set有两个问题,一来他无法存储重复的字符,二来,set也不可哈希。同理,list也是不可哈希的。直接对排序后的字符串做键呢?C++里面可以,此处也不行(因为Python中string是不可改变的)。所以,这里对键的设计比较麻烦。

不过,可以用这样一个办法:先将字符串转换成列表,队列表排序,再将排好序的列表转换成字符串,这个字符串当做哈希表的键就没问题了,每次遍历到的字符串都做这样的处理,自然可以比较。而哈希表的值可以用字符串列表中字符串位置的索引。比如样例中,键为:"ilnt",值为"[0, 1, 2]"。 最后,哈希表建立完毕后,对哈希表中的元素遍历,找到值(也就是位置的列表)的长度大于1的,根据值,找到原数组中相应元素,加入结果列表即可。

代码如下:

class Solution:
    # @param strs: A list of strings
    # @return: A list of strings
    def anagrams(self, strs):
        hash_table = {}
        result = []
        index, n = 0, len(strs)
        while index < n:
            temp = list(strs[index])
            temp.sort()
            # 下面这行代码是将list转换成string
            temp = "".join(temp)
            if temp not in hash_table:
                hash_table[temp] = [index]
            else:
                hash_table[temp].append(index)
            index += 1
        for value in hash_table.values():
            if len(value) > 1:
                for i in value:
                    result.append(strs[i])
        return result
        # write your code here
时间: 2024-10-08 18:19:03

乱序字符串的相关文章

乱序字符串anagrams

[抄题]: [思维问题]: for (String str : strs)表示对全部字母操作,后面都是对str操作的.比如str.charAt(i) - 'a' for (ArrayList<String> tmp : map.values()) 表示对全部字符串进行操作 [一句话思路]: [输入量]:空: 正常情况:特大:特小:程序里处理到的特殊情况:异常情况(不合法不合理的输入): [画图]: [一刷]: [二刷]: [三刷]: [四刷]: [五刷]: [总结]: [复杂度]:Time c

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

今天尝试编写多线程最简单的例子 #include "stdafx.h" #include "windows.h" #include <iostream> using namespace std; DWORD WINAPI Fun1Proc(LPVOID lpParamer); int main(int argc, char* argv[]) { HANDLE hThread; hThread=CreateThread(NULL,0,Fun1Proc,NU

Linq 对string[]字符串数组进行排序 (升序、降序、乱序)

using System; using System.Collections; using System.Linq; namespace ConsoleApp1 { class Program { static void Main(string[] args) { string[] array = { "a.m.", "a", "Smith", "Jones", "module", "zoolog

数据库存储数据乱序问题

由于提交的留言数据在网页端查询出来的时候,一直存在乱序的问题,有时候新留言插在旧留言的后面,有时候又插在前面,实在是头疼 尝试了一下解决方案 将数据库的存储引擎修改为innoDB 将排序规则修改为utf8_general_ci 这样的话排序就是正常了 由于留言需要倒叙排序,最新的留言显示在最上面,需要在php中将select语句进行处理 使用SELECT * FROM `messages` ORDER BY `messages_id` DESC 就可以了

文本项目系列[1]——逆序字符串

1.需求 逆转字符串——输入一个字符串,将其逆转并输出. 比如:输入字符串为:love.则输出为:evol. 注:在下文中,字符串翻转也是逆序的意思. 2.思路 有两种大的思路: (1) StringBuffer提供了字符串翻转功能,直接利用API即可. (2) 利用String本质是char数组进行字符串逆序. 3.代码 1 package com.myeclipse; 2 3 /** 4 * 逆转字符串——输入一个字符串,将其逆转并输出 5 * @author MrChen 6 * 7 */

写一个函数实现数组中的元素随机乱序排序

//原生JS写一个函数实现一个shuffle方法,将数组中的元素随机乱序排序 var shuffle = function(arr){ var len,t,rand; for(var i =0;len = arr.length,i<len;i++){ rand = parseInt(Math.random()*len);//parseInt(Math.random()*(len-1-0)+1);或者rand = Math.floor(Math.random()*(len-1-0)+1);即Mat

2015-4-2的阿里巴巴笔试题:乱序的序列保序输出(bit数组实现hash)

分布式系统中的RPC请求经常出现乱序的情况.写一个算法来将一个乱序的序列保序输出.例如,假设起始序号是1,对于(1, 2, 5, 8, 10, 4, 3, 6, 9, 7)这个序列,输出是:123, 4, 567, 8, 9, 10 上述例子中,3到来的时候会发现4,5已经在了.因此将已经满足顺序的整个序列(3, 4, 5)输出为一行. 1 #include<stdio.h> 2 3 int main() 4 { 5 int num ; 6 while(scanf("%d"

NSArray的排序和乱序

1 NSArray *array = @[@(3),@(4),@(1),@(2),@(5)]; 2 //升序 3 NSArray *array1 = [array sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { 4 return [obj1 compare:obj2]; 5 }]; 6 NSLog(@"%@",array1); 7 8 //降序 9 NSArray *array2 = [array s

AS3.0 扑克牌乱序排列法洗牌

package { /* *@ClassName:package::PokerMain *@Intro:这是一个初始化1-52扑克牌,然后进行乱序排列进行洗牌: *@Author:非若 *@Date:2015.07.22 *@LanguageVersion:ActionScript 3.0 * */ import flash.display.Sprite; public class PokerMain extends Sprite { //设置扑克牌总数 private var NUM:Numb