栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++字符串去掉重复字符

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++字符串去掉重复字符

C++里面如何去除一个字符串里面重复字符
  • 各路方法
  • 1,两层for循环
      • 时间复杂度高,代码也多
  • 2,利用set集合完成
      • 思路清晰,代码简单,效率也低
  • 3,利用stl库函数集合完成
      • 代码较少,容易理解,上手简单
  • 4,结合标记数组操作
      • 代码较多,但是处理效率高
  • 总结:

显然:大家可以使用两重循环完成这个操作,但是今天小编带大家学一下更加简单高效的方法完成字符串的去重,这个小编会在文章中讲到。

例子:string str = “abeaacda”;(小编全文将用这个例子);
处理后:"abcde"

各路方法 1,两层for循环 时间复杂度高,代码也多
## 时间复杂度高,代码也多 效率低
int i, j, k;  
    for(i = k = 0; i < str.size(); i++)  
    {  
        if(str[i])  
        {  
            str[k++] = str[i];  
            for(j = i + 1; j < str.size(); j++)  
                if(str[j] == str[i])  
                    str[j] = '';  
        }  
    } 

当然上面这个方法还可以优化:
+++++++++++++++++++++++但是+++++++++++++++

小编想说一句:算法竞赛中这方法往往报:Time LImit

2,利用set集合完成 思路清晰,代码简单,效率也低

(set集合底层:红黑树)
原理:set集合里面不能出现重复元素,是不是感觉直接的思路一下子打开。

思路清晰,代码简单,效率也低
//头文件导入不可少
#include 
...
int main(){
	set ss;
	//将string里面的字符依次装入set集合即可完完成
		for(int i=0;i 

再将set集合里面的字符一次取出即可。
注意:string字符串最后的一个字符为’’

string str_res="";
set::iterator it;
for(it=ss.begin();it!=ss.end();it++){
	//''
	if(*it=='') break;
	str_res.push_back(*it);
}
3,利用stl库函数集合完成 代码较少,容易理解,上手简单
代码 少,容易理解,上手简单
#include 
...
int main(){
    //现将字符排一下序
	sort(str,str.length());
	str.erase(unique(str.begin(),str.end()),str.end());
	//这样处理后的字符串无重复字符
	cout< 

小编有话说:
同时这个去重的模板同样可以用来

补充:
sort():排序函数
unique():去重函数(只能去除相邻字符)
erase():删除函数(删除开始,删除结束)
关于unique()函数的理解小编在这里推荐:
关于unique()函数的理解

这个方法是小编的最爱,不要问为什么,就两个字:

4,结合标记数组操作 代码较多,但是处理效率高
代码较多,但是处理效率高
 char temp[N] = { 0 };  
    int i, j, len;  
    len = strlen(s);  
    for(i = j = 0; i < len; i++)  
    {  
        if(temp[s[i]] == 0)  
        {  
            s[j++] = s[i];  
            temp[s[i]] = 1;  
        }  
    }  
    s[j] = '';  

简单优化一下

int i, j, len, rem;  
    int temp[8] = {0};  
    len = strlen(s);  
    for(i = j = 0; i < len; i++)  
    {  
        rem= s[i] % 32;  
        if((temp[s[i] >> 5] & (1 << rem)) == 0)  
        {  
            s[j++] = s[i];  
            temp[s[i] >> 5] |= (1 << rem);  
        }  
    }  
    s[j] = '';  

进一步优化
(结合具体的赛题)

同时结合不同的题目还可以进一步优化:
如果字符串中只出现a~z之间的小写字母
int i, j, val, temp;  
    j = temp= 0;  
  
    for(i = 0; s[i]; i++)  
    {  
        val = s[i] - 'a';  
        if((temp& (1 << val)) == 0)  
        {  
            s[j++] = s[i];  
            temp|= 1 << val;  
        }  
    }  
    s[j] = ''; 
总结:

要是图省事,大家可以选择方法三;要是追求时间效率,大家可以使用方法四。
小编图像:

小编ID:薇薇的憨宝

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/384598.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号