600分求一超高难度算法,不是高手不要进来!解决立即开贴给分。

dejiang 2005-05-25 02:55:39


问题:给定一个字符串,要求将重复子字符串(2位以上)用单个字符替换,使得字符串中无2位

以上重复字符子串并且使得替换后的字符串长度最小

例:abbabacdbeeabfefabafef

首先将连续字符替换 bb-g ee-h
得到:agabacdbhabfefabafef

然后将重复出现的子字符串替换为单个字符:fef-i aba-j
得到:agjcdbhabiji

或:fef-i ab-j
得到:agjacdbhjijaj

显然前一种方法得到能最佳效果12位
...全文
808 50 打赏 收藏 转发到动态 举报
写回复
用AI写文章
50 条回复
切换为时间正序
请发表友善的回复…
发表回复
wobelisk 2005-07-10
  • 打赏
  • 举报
回复
It's a NP problem.
Cybergate 2005-07-10
  • 打赏
  • 举报
回复
好像确实是NP啊,主要是押了之后的字符串还可以再压。
zzwu 2005-07-10
  • 打赏
  • 举报
回复
这是不是要进行LZW压缩?
chenqiu1024 2005-07-08
  • 打赏
  • 举报
回复
mark
centerpark 2005-07-06
  • 打赏
  • 举报
回复
这类字符串应用推荐一个函数,在string.h里的。名称是strstr。参数不记得了。
直接就可以找到要匹配的字符串在母字符串里的位置。
virgin_killer 2005-07-06
  • 打赏
  • 举报
回复
进来骂楼主这个SB,然后再走
Kvci 2005-06-12
  • 打赏
  • 举报
回复
这是不是编译原理啊?
表达式规约?
文法?
我乱来的
说错了别见怪啊
sillysky 2005-06-02
  • 打赏
  • 举报
回复
难,难,难,如果一个软件题目,不同的人有不同的题解的话;绝对是一个难题!!!!
「已注销」 2005-06-02
  • 打赏
  • 举报
回复
强烈鄙视垃圾楼主!
「已注销」 2005-06-02
  • 打赏
  • 举报
回复
to xiangxyz(明天爱谁):
不对,呵呵,自己再仔细看看吧:)
bamboo2000 2005-06-02
  • 打赏
  • 举报
回复
楼主是不是想做信息压缩啊?

如果我给出一个字符串包含所有的字符,还怎么替换啊?
如果所有的重复字符都只是两个字符而且仅出现过两次,那替换后再保存替换的信息,字符串反而会更长,得不偿失啊?

楼主还是去看一看数据压缩方面的资料吧!!
「已注销」 2005-06-01
  • 打赏
  • 举报
回复
呵呵,强。。。
那么如果执行到char大于256了呢?。。。
呵呵,不要太勉强哦。
算了,不讨论这个东西了,毫无意义。
唉,无聊啊。人都找不到了。看来没人注意这个问题了。。
xiangxyz 2005-06-01
  • 打赏
  • 举报
回复
我的看法:
如:abc e abcd abc f abcd e bcd cdcbef
1。先找出该串的所有重复子串和重复次数。
串 串长度 重复次数
abc 3 4 3*4=12
abcd 4 2 4*2=8
bcd 3 3 3*3=9
ab 2 4 8
bc 2 5 10

2.将 (串长度*重复次数) 最大的 替换

然后将新串循环 1。2步骤 直到找不到子串。

不知道对不对
jihanzhong 2005-06-01
  • 打赏
  • 举报
回复
对啊!

那要问楼主了!
叫楼主给一个getRchar(char[] src)的方法好了,用到My_replace里
「已注销」 2005-05-31
  • 打赏
  • 举报
回复
呵呵,是我看错了,呵呵。
不过少了可选替换字符的获取,呵呵
jihanzhong 2005-05-31
  • 打赏
  • 举报
回复
回朔效率比较低,但是易懂
jihanzhong 2005-05-31
  • 打赏
  • 举报
回复
回朔啊! 外面有for的
「已注销」 2005-05-31
  • 打赏
  • 举报
回复
to jihanzhong(逍遥) :
每一轮筛选最佳方案?
那就错了。


怎么这里的人就不能先分析再做呢。。。写出那些代码除了让自己爽一爽有什么用。。。
(没有别的意思,只是希望大家明白思路远比这些东西重要。)
jihanzhong 2005-05-31
  • 打赏
  • 举报
回复
呵呵~ ,第一句就是:
char [][] ch_replace=Find_replace(ch_in); //找出可替换的字符串


至于替换成什么可以放到My_replace(ch_in, ch_replace[i])里,取的字符串的最大char,给它+1;
jihanzhong 2005-05-30
  • 打赏
  • 举报
回复
只讲实现方法,不过是用的递归,效率不高

Status char[] Test(char[] ch_in){
char [][] ch_replace=Find_replace(ch_in); //找出可替换的字符串
char[] temp=null;
char[] ret=ch_in;
if(null==ch_replace) return ch_in; //递归出口;

for(int i=0; i<ch_replace.length;i++){
temp=My_replace(ch_in, ch_replace[i]); //依次按各种方案替换;第1轮替换
temp=Test(temp); //开始递归
if(ret.length>temp.length) {//找到更佳方案了
ret=temp;
}//if(char_length>temp.length)
}//for(int i=0; i<ch_replace.length;i++)
}/
加载更多回复(30)

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧