该题与我前面的一篇博客判断一个字符串是否是唯一的很相似。可以分两种情况来讨论:1、不许使用额外的存储空间;2、可使用额外的存储空间

s表示待处理的字符串,l表示当前非重复字符的个数

1、不许使用额外的存储空间

对每个待处理的字符,可以考虑在后处理和在前处理

在后处理:对每个待处理的字符,假设为c,从该字符的后一个字符开始,直到字符串的末尾,如果有字符与c相同,就将该位置的字符标记为无效,处理完毕后,将c存在到s中的l位置上。

在前处理:对每个待处理的字符,假设为c,将c与s中的第0---(l-1)个字符相比较,如果有相同的,则处理c后面的一个字符;如果没有相同的,就将c存放到s的第l个位置上,然后在处理c后面的一个字符。

上述两种方法中第一种的时间复杂度为O(n*n),第二种的时间负载读为O(k*n),k为不同字符的总数,第二种方法的代码如下:

void removeDuplicateChar(char s[])
{int i, j;int length = strlen(s);if(length < 2)return;int last = 1;/*s[i]每次都是与前last不重复的字符相比较*/for(i = 1; i < length; i++){for(j = 0; j < last; j++){if(s[i] == s[j])break;}if(j == last)s[last++] = s[i];}s[last] = '\0';
}

2、允许使用额外的存储空间

当可以使用额外的存储空间时,若可以使用较大的数组,例如char flag[256],数组中的每一个元素用来标记一个字符,在处理字符串时就先判断它在flag对应位置上的标记是否为0,若是则表示目前该字符还没有出现,因此将其存放在l位置上;反之,不对其作任何的处理。

但如若不能使用这么大的数组,就可以考虑用位表示,例如int flag[8],就可以用来表示256个数,处理的方法与使用char flag[256]是一样的。

当限定了字符的种类时,如在"a---z"之间,使用一个整型变量int flag就可以解决。

void removeDuplicateChar(char s[])
{int i, v;int length = strlen(s);if(length < 2)return;int flag = 0;int last = 0;for(i = 0; i < length; ++i){v = (int)(s[0] - 'a');if((flag & (1 << v)) == 0){s[last++] = s[i];flag |= (1 << v);}}s[last] = '\0';
}

给定一个字符串,去除整个字符串中重复的字符相关推荐

  1. 重复子字符串(给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。)

    给定一个非空的字符串,判断它是否可以由它的一个子串重复多次构成.给定的字符串只含有小写英文字母,并且长度不超过10000.   示例 1: 输入: "abab" 输出: True ...

  2. 如何删除字符串中重复的字符 用C语言实现

    对于我这个小白来说,这方法要实现起来其实挺难的,这个方法是我想了好久才想出来的,如果有哪些不足,欢迎指出,谢谢大家. #include<stdio.h> #include<strin ...

  3. 经典算法面试题目-设计算法移除字符串中重复的字符(1.3)

    题目 Design an algorithm and write code to remove the duplicate characters in a string without using a ...

  4. 删除字符串中重复的字符

    描述 删除字符串中重复的字符 分析 方法一,蛮力法.两个循环,大循环每次从数组中取出一个字符,小循环重新遍历该数组是否含有该字符. 方法二:排序法.对两个字符串的字符进行排序,再比较. 方法三:空间换 ...

  5. php消除连续字符,JS字符串去除连续或全部重复字符的实例

    这篇文章主要介绍了JS字符串去除连续或全部重复字符的实例,需要的朋友可以参考下 js字符串去除连续重复字符 ()和\number 配合使用表示重复正则第number个括号内匹配到的内容,如:(\d)\ ...

  6. android 去重 比较两个list_android 去重 比较两个list_Android 去除list集合中重复项的几种方法...

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List li1 = new List { "", "", "" ...

  7. android 去重 比较两个list_Android 去除list集合中重复项的几种方法

    因为用到list,要去除重复数据,尝试了几种方法.记录于此... 测试数据: List li1 = new List { "", "", "" ...

  8. 求栈中元素个数算法_Algorithm 大家都会的去除有序数组中重复元素的三种算法...

    问题描述 给定一个有序数组,要删除数组重复出现的元素,使得每个元素之出现一次,然后返回移除重复数组后的新长度: 示例: 给定数组 nums = [1,2,4,4],删除重复出现的元素后,原数组变成 n ...

  9. 去除IntelliJ IDEA中重复代码报灰黄色的下划波浪线

    去除IntelliJ IDEA中重复代码报灰黄色的下划波浪线 最近写Java在用IntelliJ IDEA这款传说中的神器IDE,看群里的大神们都在用,也耐不住寂寞想向大神们看齐一下.刚开始用,很多地 ...

  10. 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次。

    给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示例 2: 输入: 1->1->2->3-&g ...

最新文章

  1. 学python要多少钱-python学习费用多少合适
  2. linux ls什么意思,linux – 你如何确定bash ls的颜色是什么意思?
  3. CSDN博客导出备份工具
  4. Python ID 生成(UUID、自增、19位雪花算法ID)
  5. 求和(1,2,3.....n使其和为m的所有情况)
  6. 爬取花瓣网并批量下载图片
  7. 金蝶服务器存在但无账套信息,金蝶KIS专业版
  8. 航拍全景拍摄教程,如何制作航拍全景?
  9. win10如何退出微软账户
  10. 边境的悍匪—Kaggle—泰坦尼克号生还预测详细教程
  11. Ubuntu下装memcache
  12. 生活随记 - 75公斤重 急需减肥
  13. 汉堡按钮的制作以及其中的问题
  14. Win10 修改C盘User下的姓名【亲自踩坑】
  15. 0316复利和单利计算更新4
  16. vscode在html看到图片的插件_自从用了这款PPT插件,我才知道什么叫做高效办公!...
  17. 安装pytorch一直报错解决方法!!! ERROR: Exception: Traceback (most recent call last): File “D:\Anacoda\lib\s....
  18. 实现 外网 远程桌面 连接 个人pc(开机自启动,校园网web自动验证,多用户远程桌面)
  19. 如何查看GCC编译器版本
  20. 关于卸载流氓软件的通用办法

热门文章

  1. 记一次使用npm命令报错
  2. ROC曲线下面积为什么越大越好 (TPR FPR)
  3. 送抖音直播云挤地铁教程
  4. 【BZOJ5336】【TJOI2018】party
  5. w ndows7旗舰版怎么重装系统,windows7旗舰版64位怎么重装32位系统
  6. office2013 打开报错 无法访问您试图使用的功能所在的网络位置
  7. 计算机硕士专业有哪些课程,计算机专业考研科目有哪些
  8. 这五本热门网络小说,竟然三本在第四届橙瓜网络文学奖评选目前排在前五!
  9. 我在华为外包一年的经历分享。
  10. 深入Elasticsearch:索引的创建