zoukankan      html  css  js  c++  java
  • 字符串面试题系列之六:在字符串中删除特定的字符

    编译环境

       本系列文章所提供的算法均在以下环境下编译通过。

    【算法编译环境】Federa 8,linux 2.6.35.6-45.fc14.i686
    【处理器】 Intel(R) Core(TM)2 Quad CPU Q9400 @ 2.66GHz
    【内存】 2025272 kB

    前言

        本篇文章和上一篇文章所采用思路同出一则,做为两篇来讲,是觉得如果文章太长需要翻页很多,显然不好。显然长篇大论会让人不仅仅视觉疲劳,也会让人很不耐烦。除非幽默风趣生动。才能让小伙伴们有耐心看下去。好了, 闲话不多说。书接上回,上文用到的方法大致可以总结为:“一次扫描,向左平移”。时间复杂度为O(N)。本次算法依然采用这种方法。当然本题还用到了 “字符串hash”,这种方法也在不少算法中取得了四两拨千斤的效果,小伙伴们要记住这些名词。这让我突然想到了小时候做数学题时的小技巧。这些大概就是属于小技巧,我们可以称之为“算法小技巧”。

        本系列文章均系笔者所写,难免有一些错误或者纰漏,如果小伙伴们有好的建议或者更好的算法,请不吝赐教。

    正文

    【题目】

       输入两个字符串,从第一字符串中删除第二个字符串中所有的字符。

    【例子】

       输入”They are students.” 和”aeiou”则删除之后第一个字符串变成 Thy r stdnts。

    【分析】

       这道题来之微软,也不是很难。这说明牛X的公司也未必全是难题。所以小伙伴们不要被公司给吓倒。

       就本题来讲,大致思路在上面也提到,就是对字符串1进行扫描,然后判断当前字符是否在子字符串中出现,如果出现,则忽略不计,继续下一位,反之则复制到i指针处(i指针是指向输出的位置,初始化为0)。

       那这里有一个问题了,判断一个字符在字符串2中是否出现,如果用平时的方法,需要O(N)复杂度。显然不行。那什么方法是O(1)呢?当然只有hash算法了。“字符串hash”,我们可以把这个当作专有名词记住,让你在任何时候都知道用它。,我们对字符串2进行hash初始化,然后对字符串1就可以直接判断了。这里举一个例子吧。(虽然很简单,但也有可能我表达不清晰,让大家有所误解。)ASCII编码至于256个,每个char类型其实都是一个整数,在C语言里面我们可以定义int hash_table[256]。比如A的值是65,如果A存在则我们只要设置hash_table[(int)'A'] = 1即可。

    上面一堆废话,其实大致可以总结如下:
    用i指针来控制输出,j指针来处理子字符串出现的字符。这么说简单明了吧
    算法的文字描述如下:
    第一步:初始化hash表,并将子字符串中出现的字符对应的hash表位置设置1;
    第二步:用i指针控制输出开始为0,j指针从0处开始扫描;
    第三步:当j遇见第一个子字符串中未的字符,赋给i处.i指向下一位;反之,跳过;
    第四步:循环第三步,直到字符串末尾停止。。

    【代码】

    #include <iostream>
    #include <cstring>
    
    char * string_del_characters( char * const src, const char * const dest )
    {
       int destLen = strlen( dest );
       int hash_table[256] = { 0 };
       char * p = src;
       int index = 0;
       for( int i = 0; i < destLen; i++ )
       {
          hash_table[ (int)dest[i] ] = 1;
       }
       while( *p != '' )
       {
          if( 0 == hash_table[(int)*p] )
          {
             src[index++] = *p;
          }
          p++;
       }
       src[index] = '';
       return src;
    }
    
    int main( int argc, char ** argv )
    {
       char src[] = "They are students.";
       char dest[] = "aeiou";
       char * pResult = string_del_characters( src, dest );
       std::cout << pResult << std::endl;
    }

    【结论】

    作者

       出处:http://www.cnblogs.com/gina

       本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

  • 相关阅读:
    真正VC++.net笔记1系统时间的获取
    真正VC++.net笔记5MessageBox变MessageBoxA?
    Judge Online 系统流程设计
    杂谈1:事情因每个人的参与而不同
    ESX/ESXi 4.1 Update 1 or later 同步NTP
    iSCSI CHAP认证
    JSTL中c:set标签的要点和技巧
    JSTL 判断对象是否为空
    Smartmontools——linux磁盘检测工具
    ECMAScript 对象类型
  • 原文地址:https://www.cnblogs.com/gina/p/3247177.html
Copyright © 2011-2022 走看看