处理字符串的问题?

比如我现在想处理两个字符串,

String a = "北大再现一个人的毕业照你好哈哦额的了呢";
String b = "北大现百度一个阿里人毕照哈哦腾讯的了呢";

以a为基准,a里面包含的字,如果在b里面也有,就把它提取出来,也就是最后可以得到的字符串应该是"北大现一个人毕业照哈哦的了呢"。
这样各位有什么好的思路,最好算法速率快一点,时间上快,空间上到随意。
如果时间上是在快不起来,也说说思路。

我现在的思路是很蠢的,把字符串分成一个字的N段,然后两个for嵌套,相同就拿出来,实在是太蠢了。

阅读 4.3k
6 个回答

我的想法是先分别排序,但是记住字符串一的原始序列

然后扫描一遍这两个字符串

可理解,不明白的地方直接评论

上面这个方法不好

可以用hash的方法,这样判断a里面的字符是否在b里面就只要O(1)的时间复杂度了

for(char c:a.toCharArray())
            if(b.contains(String.valueOf(c)))
                System.out.print(c);

图片描述

javascript,只提供一个思路

var a = '北大再现一个人的毕业照你好哈哦额的了呢'
var b = '北大现百度一个阿里人毕照哈哦腾讯的了呢'
a.split('').filter(k=>~b.indexOf(k)).join('')

clipboard.png
...]

我想到一个办法,但应该不是最优,就当给题主一个参考吧。

String a = "北大再现一个人的毕业照你好哈哦额的了呢";
String b = "北大现百度一个阿里人毕照哈哦腾讯的了呢";

Set set = new HashSet();
for (int i = 0; i < b.length(); i++) {
    set.add(String.valueOf(b.charAt(i)));
}

StringBuilder result = new StringBuilder();
for (int i = 0; i < a.length(); i++) {
    String str = String.valueOf(a.charAt(i));
    if(set.contains(str)){
        result.append(str);
    }
}

System.out.println(result);

思路很简单:利用hash。

准备一个hash表,先把a遍历一遍,分别以a中的每个字符作为key,这些key对应的value全置为true;然后遍历b,分别以b中的每个字符作为key,发现key对应的value为true,则说明这个字符既在a中又在b中。

这个是常见的最长公共子序列(LCS)问题,时间复杂度是O(N^2),如果想把具体的字符串找出来,记录一个前缀就行,还有偏一点的算法是O(nlgn)。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题