查找首个非重复字符
来源:互联网 发布:java语言绝对值 编辑:程序博客网 时间:2024/06/07 15:46
问题描述:
编写一个高效的函数,找到字符串中首个非重复字符。
example:
total 首个非重复字符是 o
编写一个高效的函数,找到字符串中首个非重复字符。
example:
total 首个非重复字符是 o
teeter 首个非重复字符是 r
分析:
最直观也是最容易想到的方式就是对每个字符在字符串中遍历
一遍,若出现相同的字符则退出遍历,查看下一字符,若遍历完整
个字符串均为出现相同字符,则表明该字符是首个非重复字符。
程序代码如下:
bool FirstNonRepeated1(std::string str, char &out) {for (int i = 0; i < str.length(); ++i) {char temp = str[i];int j;for (j = 0; j < str.length(); ++j) {if (i != j && temp == str[j]) {break;}}if (j >= str.length()) {out = temp;return true;}}return false;}
从以上程序可以看出,其时间复杂度为O(n^2),效率不是很好,如何才能进一步提高它的效率呢?
我们知道数组和散列表的查找时间都是常数(散列表在最坏的情况下是O(n),但平均情况是
O(1))。要想能够快速确定一个字符是否重复,需要按字符来搜缩,这意味着需要用字符作
为下标(在数组中)或键(在散列表中)。在数组或散列表中会存放什么呢?因为不重复的字符
只在字符串中出现一次,所以若存放字符出现的次数,就能确定不重复的字符了。当完成
这项工作,就可在数组或散列表中扫描所有的计数,寻找计数为1的字符,需要主要的是,
此时查找的不重复字符不一定是原来字符串中的第一个不重复字符。解决方法是按照原字符
串顺序进行查找。
程序代码如下:
bool FirstNonRepeated(std::string str, char &out) {int flags[128] = {0};for (int i = 0; i < str.length(); ++i) {int flag = flags[str[i]];if (flag == 0) {flags[str[i]] = 1;} else if (flag == 1) {flags[str[i]]++;}}for (int i = 0; i <str.length(); ++i) {if (flags[str[i]] == 1) {out = str[i];return true;}}return false;}
现在,程序的时间复杂度将为了O(n),但是与改进前相比,增加了空间复杂度,通常这是可取的。
参考:程序员面试攻略 第六章 数组和字符串
- 查找首个非重复字符
- ASP.NET正则表达式查找字符串中重复的字符
- ASP.NET正则表达式查找字符串中重复的字符
- 查找字符串中第一个非重复字符
- 字符串查找第一个不重复的字符的实现
- 在字符串中查找是否有重复字符
- 查找字符串中第一次重复的字符 java
- 查找字符串中第一次不重复的字符 java
- 算法练习_004 查找第一个不重复的字符
- 算法题---“查找重复字符并删除”解题思路分析
- 查找字符串中第一个不重复的字符
- 查找字符串中最长无重复字符的子串
- 查找字符串中最长重复字符的子串
- 查找数组中重复出现过的字符
- 查找字符串中第一个不重复的字符
- 首个重复字符,首个非重复字符(哈希表)
- Linux查找大体积文件,及vim查找统计重复字符出现的次数
- 查找字符流中第一个出现的不重复字符
- 指针的错误赋值
- UVAlive 2911 Maximum(贪心)
- 【菜鸟学习Linux】-第二章- Linux环境搭建-使用VMware9联网设置”
- Eclipse cdt安装与使用 (C/C++插件安装)
- HDU4697 Convex hull
- 查找首个非重复字符
- HDU 4704 Sum 费马小定理+快速幂
- Spring中使用getSession()与通过HibernateTemplate进行数据操作的差别
- Hibernate默认连接池使用问题
- HP DL360 G7通过iLO部署系统
- 如何提高网站访问速度
- ubuntu常用配置
- 如何在没有管理员权限的win7上设置环境变量
- 字符串转换器2013.08.23