zoukankan      html  css  js  c++  java
  • 查找首个非重复字符

    问题描述:
         编写一个高效的函数,找到字符串中首个非重复字符。
         example:
          total    首个非重复字符是 o

          teeter   首个非重复字符是 r 

     分析:
         最直观也是最容易想到的方式就是对每个字符在字符串中遍历
     一遍,若出现相同的字符则退出遍历,查看下一字符,若遍历完整
     个字符串均为出现相同字符,则表明该字符是首个非重复字符。

    程序代码如下:

    1. bool FirstNonRepeated1(std::string str, char &out) {  
    2.     for (int i = 0; i < str.length(); ++i) {  
    3.         char temp = str[i];  
    4.         int j;  
    5.         for (j = 0; j < str.length(); ++j) {  
    6.             if (i != j && temp == str[j]) {  
    7.                 break;  
    8.             }  
    9.         }  
    10.         if (j >= str.length()) {  
    11.             out = temp;  
    12.             return true;  
    13.         }  
    14.     }  
    15.     return false;  
    16. }  


    从以上程序可以看出,其时间复杂度为O(n^2),效率不是很好,如何才能进一步提高它的效率呢?
    我们知道数组和散列表的查找时间都是常数(散列表在最坏的情况下是O(n),但平均情况是
    O(1))。要想能够快速确定一个字符是否重复,需要按字符来搜缩,这意味着需要用字符作
    为下标(在数组中)或键(在散列表中)。在数组或散列表中会存放什么呢?因为不重复的字符
    只在字符串中出现一次,所以若存放字符出现的次数,就能确定不重复的字符了。当完成
    这项工作,就可在数组或散列表中扫描所有的计数,寻找计数为1的字符,需要主要的是,
    此时查找的不重复字符不一定是原来字符串中的第一个不重复字符。解决方法是按照原字符
    串顺序进行查找。
    程序代码如下:

    1. bool FirstNonRepeated(std::string str, char &out) {  
    2.     int flags[128] = {0};  
    3.     for (int i = 0; i < str.length(); ++i) {  
    4.         int flag = flags[str[i]];  
    5.         if (flag == 0) {  
    6.             flags[str[i]] = 1;  
    7.         } else if (flag == 1) {  
    8.             flags[str[i]]++;  
    9.         }  
    10.     }  
    11.     for (int i = 0; i <str.length(); ++i) {  
    12.         if (flags[str[i]] == 1) {  
    13.             out = str[i];  
    14.             return true;  
    15.         }  
    16.     }  
    17.     return false;  
    18. }  

    现在,程序的时间复杂度将为了O(n),但是与改进前相比,增加了空间复杂度,通常这是可取的。

    参考:程序员面试攻略 第六章 数组和字符串

    转载自:https://blog.csdn.net/Kai_gai/article/details/10204317

  • 相关阅读:
    排序算法
    顺序表与链表
    二叉树
    查找算法
    15 Django 离线脚本
    poj 1330 Nearest Common Ancestors(LCA 基于二分搜索+st&rmq的LCA)
    hdu 6158 The Designer( 反演圆)
    圆的反演性质
    HDU 6153 A Secret(扩展kmp)
    kmp&扩展kmp
  • 原文地址:https://www.cnblogs.com/LinQingYang/p/11875685.html
Copyright © 2011-2022 走看看