判断短字符串中的每个字母是否都在长字符串中出现过
2018-03-07 14:30
405 查看
假设这有一个各种字母组成的字符串,假设这还有另外一个字符串,而且这个字符串里的字母数相对少一些。从算法上讲,什么方法能最快的查出所有小字符串里的字母在大字符串里都有? 比如,如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOM 答案是true,所有在string2里的字母string1也都有。如果是下面两个字符串: String 1: ABCDEFGHLMNOPQRS String 2: DCGSRQPOZ 答案是false,因为第二个字符串里的Z字母不在第一个字符串里。 方法一[时间复杂度O(m*n)]: 对于这种操作一种幼稚的做法是轮询第二个字符串里的每个字母,看它是否同在第一个字符串里。从算法上讲,这需要O(n*m)次操作,其中n是string1的长度,m是string2的长度。就拿上面的例子来说,最坏的情况下将会有16*8 = 128次操作。 方法二:一个稍微好一点的方案是先对这两个字符串的字母进行排序,然后同时对两个字串依次轮询。两个字串的排序需要(常规情况)O(m log m)+ O(n log n)次操作,之后的线性扫描需要O(m+n)次操作。同样拿上面的字串做例子,将会需要16*4 + 8*3 = 88加上对两个字串线性扫描的16 + 8 = 24的操作。(随着字串长度的增长,你会发现这个算法的效果会越来越好) 方法三[时间复杂度O(n+m)]: 对第一个字串进行轮询,把其中的每个字母都放入一个Hashtable里(成本是O(n)或16次操作)。然后轮询第二个字串,在Hashtable里查询每个字母,看能否找到。如果找不到,说明没有匹配成功。这将消耗掉8次操作——这样两项操作加起来一共只有24次。 方法四: 假设我们有一个一定个数的字母组成字串——我给每个字母分配一个素数,从2开始,往后类推。这样A将会是2,B将会是3,C将会是5,等等。现在我遍历第一个字串,把每个字母代表的素数相乘,你最终会得到一个很大的整数。然后——轮询第二个字符串,用每个字母除它。如果除的结果有余数,这说明有不匹配的字母。如果整个过程中没有余数,你应该知道它是第一个字串恰好的子集了。
相关文章推荐
- 判断字符串中每个字符是否唯一出现
- 统计一个字符串中每个字母是否只出现了一次
- Isomorphic Strings 判断俩等长字符串对应位置出现的字母是否类比相等
- 判断字符串中每个字符出现的次数
- TreeMap获取该字符串中的每个字母出现的次数
- iOS切割字符串,并判断首字母是否为某一个字母
- 输入一段字符串,无论是否有重复元素出现,都只打印一次出现过的大写字母和小写字母, 且按字母表顺序打印。(如输入AaAa!<-131->!zZzZ, 只打印A Z a z)
- android 判断字符串是否同时包含小写字母与数字
- android 判断字符串是否为数字或中文或字母
- c#判断字符串是否全部为数字和字母
- 用java编写一个函数,统计一个字符串中每个字母出现的次数
- java判断字符串是否为数字或中文或字母
- 字典序问题。在数据加密和数据压缩中常需要对特殊的字符串进行编码。给定的字母表A由26个小写字母组成。该字母表产生的升序字符串中字母从左到右出现的次序与字母在字母表中出现的次序相同,且每个字符最多出现1
- java实现计算出字符串中每个字母出现次数
- 字符串统计の每个字母出现的个数
- java面试题:输出字符串每个字母出现的次数
- Java 统计一个字符串中每个单词,或者字母出现的次数
- iOS开发笔记之判断字符串是否为浮点型或整型,是否以字母开头
- 判断短字符串中的所有字符是否在长字符串中全部出现
- java 判断字符串中是否含有字母