Algorithm 删除字符串S1中出现在字符串S2中的所有字符

Algorithm 删除字符串S1中出现在字符串S2中的所有字符,algorithm,Algorithm,给定两个字符串S1和S2,S=S1-S2被定义为从S1获取S2中的所有字符后的剩余字符串。如何尽可能快地计算任意给定字符串的S1-S2 例如: 输入: 他们是学生 aeiou 输出: 你的r stdnts 我试过散列图,法官Sadly说它太慢了,但有没有更快的解决方案 这是我的密码: #include <stdio.h> #include <stdlib.h> #include <string.h> bool occur[300]={false}; int m

给定两个字符串S1和S2,S=S1-S2被定义为从S1获取S2中的所有字符后的剩余字符串。如何尽可能快地计算任意给定字符串的S1-S2

例如:

输入:

他们是学生

aeiou

输出:

你的r stdnts

我试过散列图,法官Sadly说它太慢了,但有没有更快的解决方案

这是我的密码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
bool occur[300]={false};
int main()
{
    char str1[10002];
    gets(str1);
    char ch;
    while((ch=getchar())!='\n')
        occur[ch]=true;
    int i;
    for(i=0;i<strlen(str1);i++)
        if(occur[str1[i]])
            continue;
        else
            putchar(str1[i]);
    putchar('\n');
    return 0;
}
#包括
#包括
#包括
bool-occure[300]={false};
int main()
{
char-str1[10002];
获取(str1);
char ch;
而((ch=getchar())!='\n')
发生[ch]=true;
int i;
对于(i=0;i我认为你应该:

  • 创建包含S2中所有字符的哈希集
  • 使用在遍历不在S中的S1时附加字符的列表
  • 从列表中生成字符串(Python中的“.”join(list..)
  • 我不认为有更快的方法..你可以把S1分成N个部分,然后并行工作-这是我看到的唯一优化


    至于您的代码-不要在循环条件下使用strlen!请参阅:。只需在所有字符上迭代,直到获得“\0”字符或计算strlen一次,然后放入循环条件下使用的变量…

    如果您可以将问题限制为一个小字母表(例如,仅限英语字符),您可以创建与字母表大小相同的布尔数组


    1数组查找将比哈希或遍历二叉树快得多。

    最快、最简单的方法之一可能是使用正则表达式替换。请参阅下面的python示例代码

    如果不能使用正则表达式,则需要对输入字符串的每个字符执行一个循环。因为您正在对每个字符执行操作,所以任何算法都至少是
    O(n)
    。这意味着加快实现速度的唯一方法是减少检查字符是否需要复制到输出以及实际复制到输出所花费的时间。由于我不知道您使用的是哪种语言,我将用python给出一个简短的实现。这使用python
    set
    类ws for constant time检查值是否在集合中。下面给出了示例代码

    import re
    
    def remove1(string, chars):
        return re.sub("[%s]"%chars, "", string)
    
    def remove2(string, chars):
        chars = set(chars)
        res = ""
        for c in string:
            if c not in chars:
                res += c
    
        return res
    
    import unittest
    
    class TestRemove(unittest.TestCase):
        def test_removeVowels1(self):
            self.assertEqual("Thy r stdnts.", remove1("They are students.","aeiou"))
    
        def test_removeVowels1(self):
            self.assertEqual("Thy r stdnts.", remove2("They are students.","aeiou"))
    
    if __name__=="__main__":
        unittest.main()
    

    注意:如果你使用的是一种C++语言,你知道输入限制为8位值,最快的方法是使用直接的加值;使用字符值作为数组索引。,其中

    n
    是句子的长度,
    m
    是禁用字符的数量

    在我看来,这是你能得到的最快的速度,因为你必须通过句子决定是否保留或丢弃该角色。此外,你必须至少通过一次所有禁止的角色才能了解它们

    但是,我可以想象,有更有效的解决方案,如所提出的,即更少的开销。但老实说,我想不出一个

    更新(这是最简单的方法,但它是O(n*m)。但是,对于短字符串,它可能比其他方法更快):


    “我试过哈希映射”--如何解决?有多种方法可以使用哈希表来解决此问题。请描述您当前的算法。同意larsmans的意见。此问题的最快解决方案必然涉及哈希映射或数组索引。此外,虽然您没有指定语言,但我相信您已经编写了一个程序。添加您当前的实现我不认为我有什么办法,但是如果你试着去看,你可以把它们拿出来2)3)我认为这些可能会有所帮助,我在前面看到了一些。我添加了上面的代码,你们中有谁能想出更好的解决方案吗?事实上,如果字符是8位的,您可能只需要将字符用作数组的索引:这里不需要散列函数。根据体系结构,255字节数组可能非常有用ffordable.非常感谢,我更改了代码,在线评委接受了~我添加了代码,我认为这是最致命的解决方案,但在线评委告诉我“时间有限”…你的“在线评判员”肯定混淆了“简单性”和“性能”。我会在我的答案中添加一个非常简单的版本。我在这里展示了我的代码,但在线评判员仍然告诉我“时间有限”
    foreach (c in sentence) 
      if (forbiddenChars.IndexOf(c) == -1) 
        Console.Write(c);