字符串子集问题

给定一个长的字符串string1和另一个较短的字符串string2,然后判断下较短的字符串string2中的所有字符是否都在string1中出现过。

这个有4个解法

第1种就是全部遍历一边,设string1的字符个数为len1, string2的字符个数为len2, 且len2 < len1;

取出string2种的所有字符与string1的字符逐个对比匹配,时间复杂度是O(len1*len2)

第2种是先对sting1和 string2排序,所需时间是O(len1*log(len1));

剩下是对两个字符串进行匹配,用两个变量p1, p2指示string1和string2的匹配进度,只需要O(len1+len2)的时间就可以完成匹配

所有在O(len1*log(len1))时间内可以判断出string2的字符是否都在string1字符串中出现。

第3种是用哈希表的方法

将string1的所有字符都映射到一个表中,然后查询string2的字符是否在表中出现,这个方法需要O(len1+len2)的时间。

还有一种方法比较特别,这个是用一些素数去表示对应的字符,比如a->2, b->3, c->5, d->7, e->11,
f->13,....,

string1的所有字符所代码的素数相乘,可以得到一个很大的数r,然后用这个数r除string2的每个字符的素数

如果能够除尽,说明sting2是string1的子集,如果出现余数不为零则说明string2中存在某些string1没有的字符。

原文可以参照一个翻译过来的文章:http://kb.cnblogs.com/page/150578/

时间: 2025-01-11 00:16:19

字符串子集问题的相关文章

C语言实现求字符串子集问题

这个问题在于实现Apriori算法的时候需要求各个频繁集的关联规则,而这时需要在求得最大的频繁集中求各个频繁集的真子集.然后在实现这一步的时候被卡主了,第一反应是用递归完成,但是面对数据挖掘中庞大的项目集,递归显然很低效,而且估计跑不起来,所以用迭代的方法显然比较靠谱. 网上非递归的方法有用二进制加法模拟实现,具体就是 例如有abcd,用0000加1->0001这里的1就映射到相应的位置的字符串,例如对于0101也就是bd,那么我们通过不停对他加1,那么就能模拟出这个过程.这个方法显然很好,但是

正则表达式及R字符串处理之终结版

转载于: 正则表达式及R字符串处理之终结版 0.动机:为什么学习字符串处理 传统的统计学教育几乎没有告诉过我们,如何进行文本的统计建模分析.然而,我们日常生活中接触到的大部分数据都是以文本的形式存在.文本分析与挖掘在业界中也有着非常广泛的应用. 由于文本数据大多属于非结构化的数据,要想对文本数据进行传统的统计模型分析,必须要经过层层的数据清洗与整理. 今天我们要介绍的『正则表达式及R字符串处理』就是用来干这一种脏活累活的. 与建立酷炫的模型比起来,数据的清洗与整理似乎是一种低档次的工作.如果把建

matlab字符串操作总结

matlab字符串操作总结 字符串操作总结 char(S1,S2,…)利用给定的字符串或单元数组创建字符数组double(S)将字符串转化成ASC码形式cellstr(S)利用的给定的字符数组创建字符串单元数组blanks(n)生成一个由n个空格组成的字符串deblank(S)删除尾部的空格eval_r(S) evalc(S)使用MATLAB解释器求字符串表达式的值ischar(S)判断是不是字符串数组iscellstr(C)判断是不是字符串单元数组isletter(S)判断是不是字母isspa

python全栈开发从入门到放弃之字符串的应用

1.strip strip 脱去(...的)衣服 去掉左右两边的空白msg=' hellprint(msg) 1 1 print(msg.strip()) #去掉左右两边的空白 2 2 3 3 hello 4 4 hello 5 5 6 6 msg='********hello************' 7 7 print(msg) 8 8 print(msg.strip('*')) #指定的去掉左右两边的* 9 9 ********hello************ 10 10 11 11 h

关于正则表达式的入门心得

说起正则表达式,相信很多高手和大牛都不陌生,可对于我这个一年不写一段正则的人来说却是还是不知如何下手的,最近刚好接触了一些,总结写基础要点,第一用来加深记忆,第二分享给和我一样的初学者作为学习参考: 是请是这样的:前段时间在开发过程中遇到一个需求,从数据库中查询出来图片地址,在程序中需要加上域名,然后把所有的"\"全部替换成"/",最后替换不同的尺寸格式.已经有了现成的类似的代码实现,只需要copy过来修改一下即可,可是发现使用C#的string.Replace()

[LeetCode] 115. 不同的子序列

题目链接 : https://leetcode-cn.com/problems/distinct-subsequences/ 题目描述: 给定一个字符串 S 和一个字符串 T,计算在 S 的子序列中 T 出现的个数. 一个字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串.(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是) 示例: 示例 1: 输入: S = "ra

python方法

数字 int(整形) 先记住: int: n="11" m=int(n,base=2) print(m) “11”当成二进制转换成十进制 bit_length(): n=11 m=n.bit_length() print(m) 当前数字至少用几位二进制来表示 class int(object): """ int(x=0) -> int or long int(x, base=10) -> int or long Convert a number

算法13------集合所有的子集或者字符串所有子串

1.题目: 给定字符串s='abc',所有子集:'a','b','c','ab','ac','bc','abc'. 所有子串:'a','b','c','ab','bc','abc' 2.所有子集代码: (1)位运算:(输入s为字符串)(输出subStr为迭代器,子集列表) def SubSet(s): N = len(s) for i in range(2**N): subStr = [] for j in range(N): if(i >> j ) % 2 == 1: subStr.appe

jstl fn:substring()函数代码和用法 - 返回一个指定的字符串的开始和结束索引的一个子集。

uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %> 上面的 uri 根据你的实际情况定. ${fn:substring("你要截取的字符串"),beginIndex,endIndex} 网友回复:可以截取,用fn函数: <%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/fun