经典考题——无重复字符问题(查找字符串中第一个无重复字符)
来源:互联网 发布:2016年8月非农数据 编辑:程序博客网 时间:2024/05/27 14:12
题目描述:
寻求最佳的算法
编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.要求算法效率优于O(n2)。
分析:个人觉得,这个题目如果不强调效率就有点简单了吧,两层循环弄一下应该没问题了。但是另外一个角度,我觉得这个题目肯定是要遍历字符串的,所以算法效率最低应该就是O(n)吧,不知道是否是这样。
在笔试群硕的时候,由于时间关系,这个题我没有写代码,在只有5分钟的情况下,写了个思路。我当时写的是:
对字符串排序(用O(n)以下的方法,很多啦),然后遍历一次排序后的字符串。回来后,我发现我思路有问题,这样做如何是找所有的无重复字符倒是可以,但是要找到第一个,就没法了。
这个题目在网上看了一下,思路倒是不少,其中有个典型思路听起来很简单,很有效率,但是事实上太没效率了。思路是:遍历字符串,如果当前字符在字符串中从前往后数和从后往前数的下标是一个数(在java和c++中有类的方法可以找到下标),那么就说明无重复。一听这思路,很简洁啊,效率也不错吧,其实不是,这里调用的类的方法效率就很低了,这方法内部肯定要遍历字符串,效率没有提高。
下面的代码是我回来之后写的,思路大概是:统计每个字符串的个数到字母表数组中,并且统计对应的出现的下标到索引数组,然后再遍历字母表数组,根据个数判断是否是重复的,并到索引数组中查找对应的下标是不是最小的(最前面的),就可以得到是哪一个字符是第一个无重复的了。
- /*
- 编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.
- 要求算法效率优于O(n2).
- */
- #include <iostream>
- using namespace std;
- char findStr(const char* str)
- {
- int len=strlen(str),count[26],index[26];
- char result,curr;
- for(int j=0;j<26;j++)
- {
- count[j]=0;
- index[j]=0;
- }
- bool exist=false;
- for(int i=len;i>0;i--)
- {
- curr=str[i-1];
- count[curr-'a']++;
- index[curr-'a']=i-1;
- }
- int minIndex=len+1;
- for(i=0;i<26;i++)
- {
- if(count[i]==1)
- {
- if(index[i]<minIndex)
- {
- minIndex=index[i];
- }
- }
- }
- return str[minIndex];
- }
- int main()
- {
- const char* test="aac";
- cout<<findStr(test)<<endl;
- return 0;
- }
以下代码和上面代码思路类似,但是更巧妙一点,没有记录索引,效率也为O(n):
参考如下网页:http://www.360doc.com/content/06/1023/12/11192_237819.shtml
- /*
- 编写一个高效率函数来找出一个字符串中第一个无重复字符.例如:”total”中的o,”teeter”中的r.
- 要求算法效率优于O(n2).
- */
- #include <iostream>
- using namespace std;
- char findStr(const char* str)
- {
- int p[256];
- int i,j;
- for(i=0;i<256;i++)
- p[i]=0;
- i=0;
- while(str[i]!='/0')
- {
- p[str[i]]++;
- i++;
- }
- for(i=0;str[i]!='/0';i++)
- {
- if(p[str[i]]==1)
- {
- return str[i];
- }
- }
- return 0;
- }
- int main()
- {
- const char* test="acacdcefe";
- cout<<findStr(test)<<endl;
- return 0;
- }
网上还有一些其他解法吧,甚至用到了哈希的,不管了,以上两个程序已经很不错了。
- 经典考题——无重复字符问题(查找字符串中第一个无重复字符)
- 经典考题——无重复字符问题(查找字符串中第一个无重复字符)
- 第一个无重复字符
- 求第一个无重复字符
- 求第一个无重复字符
- 求第一个无重复字符
- 求第一个无重复字符
- 查找字符串中最长无重复字符的子串
- 求一个字符串中第一个出现无重复的字符
- 查找字符串中第一个非重复字符
- 查找字符串中第一个不重复的字符
- 查找字符串中第一个不重复的字符
- 算法1——在一个字符串中查找第一个非重复的字符
- (1.4.5.1)Java编程题——在一个字符串中查找第一个非重复的字符
- 字符串的全排列问题(一)——无重复出现字符的排列
- 字符串中第一个重复的字符
- 经典算法——字符流中第一个不重复的字符
- 字符串------字符流中第一个不重复的字符
- Git学习教程(三):Git工作流程
- 动态规划经典题目
- vim 将文件从dos格式转换到unix格式
- Git学习教程(四):分枝和合并
- Android中的任务和进程详解
- 经典考题——无重复字符问题(查找字符串中第一个无重复字符)
- 测试工程师笔试题
- 不漏掉一个Bug,你需要怎样做?
- 关于linux中带有位的整形的定义
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
- Git学习教程(五):Git标签
- 从自然数1~N里任取R个数的可能组合
- sql 记录 :不四舍五入保留小数位、得到某月第一天
- JBOSS 6.0 中 使用 MDB