| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1813 人关注过本帖
标题:关于删除字符串中字符的问题
只看楼主 加入收藏
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
结帖率:95.45%
收藏
已结贴  问题点数:5 回复次数:10 
关于删除字符串中字符的问题
怎么把字符串中重复的字符只保留第一个,数组(或动态存储空间)长度也相应减少,比如aabc 输出abc,aaaaac输出ac
搜索更多相关主题的帖子: 动态 字符串 空间 
2016-12-15 21:29
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10538
专家分:42927
注 册:2014-5-20
收藏
得分:5 
#include <stdio.h>
main()
{
    char s[]="aaccccbbbddddd";
    char c[256]={0};
    char *p;
    int i=1;
    puts(s);
    for (p=s; *p; p++)
        if (c[(unsigned char)*p] == 0)
            c[(unsigned char)*p] = i++;
            
    s[--i] = 0;        
    for (i=0; i<256; i++)
        if (c[i] > 0)
            s[c[i]-1] = i;
    puts(s);
}


[此贴子已经被作者于2016-12-15 21:59编辑过]

2016-12-15 21:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 吹水佬
sunday算法

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-15 22:04
bjut_Allen
Rank: 9Rank: 9Rank: 9
来 自:平乐园工业技术学校
等 级:蜘蛛侠
威 望:8
帖 子:323
专家分:1223
注 册:2016-10-16
收藏
得分:0 
给我点时间研究研究,太强了

Code is my life.
2016-12-15 22:42
艾瑞克
Rank: 3Rank: 3
来 自:贵州
等 级:论坛游侠
帖 子:100
专家分:105
注 册:2016-11-8
收藏
得分:0 
什么是sunday算法  九转星河
2016-12-16 22:28
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
关于Sunday算法,第一次看到吹版主提出,我就百度了的,并按我的理解注释在我的代码里了,但很快被吹版主更正,吹版主把在asc码表登记最右边字符出现的位置理解为Sunday算法核心。我虽不苟同,但因无认识,就没再跟题。现发现该算法反复被误传,为正视听,现给出别人的理解供广大坛友参考:http://
通过百度多篇关于Sunday算法文章,我当初那种认为也有偏颇,我那种无需一个个比较的算法可能叫BM算法。有代码实现Sunday算法的确用了码表,只是一种空间换时间技巧,算不上算法核心,并且不是我们那种用法,只记录子串字母出现位置方便计算下次比较位置而已。
收到的鲜花
  • 九转星河2016-12-17 10:34 送鲜花  5朵   附言:好文章
2016-12-17 00:04
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 6楼 xzlxzlxzl
;,以前我以为出现A表就认为这是sunday算法,看来我还是要认真看看你提供的网站啊,学习了

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-12-17 10:30
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10538
专家分:42927
注 册:2014-5-20
收藏
得分:0 
这贴有个试用Sunday算法写strstr(),有示例说明,Sunday算法的子串数组,对于子串中重复出现的字符,为什么只保存最右边那个字符(最后出现的)。
https://bbs.bccn.net/viewthread.php?tid=472110&page=2#pid2604301
2016-12-17 11:15
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10538
专家分:42927
注 册:2014-5-20
收藏
得分:0 
Sunday算法是字符串搜索匹配算法,他与其他类似算法的不同点是巧妙地使用了一个子串数组,当要搜寻子串时不用去扫描子串,而时点到即得到,从而大大提高了字符比对速度。
Sunday算法这巧妙做法的思想,有时变通一下用来解决其他问题也挺好使的。
如字符列表的排序:zxcmvbnmb -> bbcmmnvxz,扫描一次zxcmvbnmb就搞定。
#include <stdio.h>
int main()
{
    char s[]="zxcmvbnmb";
    int i, j, c[128]={0};
    char *p;
        //一次扫描
    for (p=s; *p; p++)
        c[*p]++;
        //输出结果
    for (i=0; i<128; i++)
        if (c[i] > 0)
            for (j=0; j<c[i]; j++)
                printf("%c", i);
            
}
2016-12-17 11:43
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 9楼 吹水佬
嗯,这叫“计数法排序”,是有限域正整数集合快速排序的一种方法,其实就是查表法的一种实用。
查表法的优缺点大家可以百度。查表法不是sunday算法核心,我在6楼提供的链接里的代码示例就没有使用查表法。
就我理解sunday算法的核心是:正向取源串和子串逐个比较,发现不同则源串比较位置+子串长度,此时再反向比较子串,有相同,对齐和源串逐个比较,凡是不同则源串的比较位置加子串长度。因此最快的比较次数为“源串长度/子串长度”,最痞的比较等同于逐个比较,这种情况发生在每次取出比较位置的源串字符=子串第二个字符。


[此贴子已经被作者于2016-12-18 13:45编辑过]

2016-12-18 13:31
快速回复:关于删除字符串中字符的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016185 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved