Algorithm 挤压功能挤压(s1,s2)。。。。。需要建议

Algorithm 挤压功能挤压(s1,s2)。。。。。需要建议,algorithm,Algorithm,我想写一个挤压函数挤压(s1,s2),删除s1中与字符串s2中任何字符匹配的每个字符 除了时间复杂度(m*n)之外,是否还有其他算法可用,即遍历字符串s1m次(s2的长度)并跳过s2中出现的所有字符 谢谢 创建位图(布尔数组) 遍历字符串s2,切换与字符对应的每个位 遍历字符串s1,如果对应位为真,则跳过该字符 显然,如果希望允许更多字符,请修改长度(下面的示例需要ToLower()/ToUpper(),因为它使用26) 粗略的C#概念验证示例(准备粘贴到LINQPad中): 您可以通过将掩码设

我想写一个挤压函数挤压(s1,s2),删除s1中与字符串s2中任何字符匹配的每个字符

除了时间复杂度(m*n)之外,是否还有其他算法可用,即遍历字符串s1m次(s2的长度)并跳过s2中出现的所有字符

谢谢

创建位图(布尔数组)

遍历字符串s2,切换与字符对应的每个位

遍历字符串s1,如果对应位为真,则跳过该字符

显然,如果希望允许更多字符,请修改长度(下面的示例需要ToLower()/ToUpper(),因为它使用26)

粗略的C#概念验证示例(准备粘贴到LINQPad中):

您可以通过将掩码设置为128长来支持ASCII。(并删除ToLower()调用)等。

使用集合

private static String squeeze(String s1, String s2) {
    StringBuilder sb = new StringBuilder(); 
    HashSet<Character> set = new HashSet<Character>();
    for(char c: s2.toCharArray()) set.add(c);
    for(char c: s1.toCharArray())
        if(!set.contains(c))
            sb.append(c);
    return sb.toString();
}

//示例

String s1 = "badcode";
String s2 = "abcd";
String squeezed = squeeze(s1,s2);
输出:oe

private static String squeeze(String s1, String s2) {
        StringBuilder sb = new StringBuilder(); 
        BitSet bs = new BitSet(256);
        for(char c: s2.toCharArray()) bs.set(c);
        for(char c: s1.toCharArray())
            if(!bs.get(c))
                sb.append(c);
        return sb.toString();
    }
String s1 = "badcode";
String s2 = "abcd";
String squeezed = squeeze(s1,s2);