社区
数据结构与算法
帖子详情
有难度的算法题,一齐思考吧!
szws
2005-04-08 09:21:27
加精
给定一组字符串,要求求出一个最短的字符串使得它包含所有给出的字符串。
比如"a","bc","ca".输出应该是"bca".
...全文
322
15
打赏
收藏
有难度的算法题,一齐思考吧!
给定一组字符串,要求求出一个最短的字符串使得它包含所有给出的字符串。 比如"a","bc","ca".输出应该是"bca".
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
15 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
gumbour
2005-04-13
打赏
举报
回复
其实可以转化为图论的最短路径问题解决
Step1 去掉所有被其他字符串包含的字符串
例如 abc bc则可以当bc不存在
Step2 找出 和其他字符串首位不衔接的字符串
例如 存在abc 但不存在以a结尾和或以c开头的字符串
Step3 前两种字符串并不需要我们计算,关键是其余的字符串
我们建立一个邻接矩阵d[N][N]来表示2个字符串之间的距离,
具体的含义:d[i][j]表示第i个字符串后面连接第j个字符串所增加的长度
d[i][i]表示strlen(i)
这是一个非对称矩阵
例如 str[1]= "abcd"
str[2]= "cdefa"
则 d[1][2] = strlen("abcdefa") - strlen("abcd") = 3
d[2][1] = strlen("cdefabcd")- strlen("cdefa")= 3
再加一个额外的点 --第0个点
第0个点到任一点的距离就是这个点所代表的字符串长度
这样问题就转化城市连接问题 地点到i点的距离为d[i][i]
最后再加上Step2的字符串的所有长度就是结果了
城市连接问题:
某一地区有若干个主要城市,现准备修建高速公路把这些城市连接起来,使得从其中任何一个城市都可以经高速公路直接或间接到达另一个城市。假定已经知道了任意两个城市之间修建高速公路的成本,那么应如何决定在哪些城市间修建高速公路,使得总成本最小?
关于城市连接问题 在很多算法教材里是作为例题讲解的
cosio
2005-04-11
打赏
举报
回复
标准做法是玫举所有排列
就有这种方法完整找全所有的字符串
如:123 456 abc efg
所有的字符串?
galois_godel
2005-04-11
打赏
举报
回复
以前有2道acm题目就是这样的,标准做法是玫举所有排列
xiaohaiyan
2005-04-11
打赏
举报
回复
/*
大家看看这样的优化方法可行否:
StringSet = { "ae","bc", "bca","aef","eap","abc"};
1. 进行类Radix 排序的方式,结束之后,相互包含的字符串将被合并
进行LSD 基数排序,如果高位不存在则按次高位进行排序,
插入的时候进行strstr搜索,合并包含的字符
1)
a->bca
b->
c->(bc)->abc 插入的时候合并了bc
e->ae
f->aef
p->eap
Result :bca ,abc,ae,aef,eap
2)
a->eap
b->abc
c->bca
e->(ae)->aef 插入的时候合并了ae
f->
p->
Result : eap,abc,bca,aef
3)
a->abc->aef
b->bca
c->
e->eap
f->
p->
Result : abc, aef, bca,eap
上述算法时间复杂度为: O(d(n+ 26 ) )
( 如果在此基础上再进行全排列寻找也可以,上述方法应该能将算法复杂度降低一个层次)
现在的问题是能否对首尾重合的字符串合并提出一个比较好的算法
还请多多执教
*/
xdspower
2005-04-11
打赏
举报
回复
理论上 xiaohaiyan(xiaohaiyan)的方法在字符串比较少的情况下是可行的,但复杂度随字符串的增加增加太快了.所以楼主说这个是一个有难度的算法题确实如此啊.
xiaohaiyan
2005-04-11
打赏
举报
回复
上述程序得到的最优解:
b c a e f e p
e p b c a e f
xiaohaiyan
2005-04-11
打赏
举报
回复
按照 galois_godel思路写的程序:思路是这样的
1.找出最小字符集,如"ae", "bc", "bca", "aef", "ep",最小字符集是 "abcefp"
2.记录每个字符的出现次数
3.在最小字符集的基础上,按照每个字符出现次数扩大字符集
4.在字符集上进行全排列并strstr所有的字符串,首先找出来的应该是最优解
char *string [] = { "ae", "bc", "bca", "aef", "ep"};
int seq[26] = {0};
int minCount = 0x0fffff;
void print_array(char array[],int n)
{
for ( int i = 0;i < n; i++ )
printf("%c ",array[i] );
printf("\n");
}
int swap ( char * array , int i, int j )
{
char temp ;
temp = array[i];
array[i] = array[j] ;
array[j] = temp;
return 0;
}
int permute (char array[],int left, int n, char* string[] )
{
int i =0;
int t = 1, pos = 0;
if ( left < n -1)
{
permute(array, left + 1 ,n,string );/*Output every permute before swapping*/
for ( i = left +1 ; i < n; i++ )
{
swap (array, i, left);
permute(array, left + 1 ,n ,string);
swap(array, left, i);
}
}else{
while ( t && pos < 5) /*pos condition is important */
{
if ( strstr( array, string[pos] ) == NULL )
t = 0;
else
pos++;
}
if ( strlen ( array) > minCount )
t = 0;
else
minCount = strlen ( array );
if ( t )
print_array(array,n);
return 1;
}
return 0;
}
int seq_calculate ( int *array, char *string[] ,int num)
{
int i = 0 , j = 0;
char * p = NULL;
for ( i = 0; i < num; i++ )
{
p = string[ i ];
for ( j = 0; j < strlen (p ); j++ )
array[ p[j] -'a' ] ++;
}
return 0;
}
int minCharSet ( int * array, int size,char ** result )
{
int i = 0, count = 0, pos = 0;
for ( i = 0; i < size ; i++ )
if ( array[i] != 0 )
{
count++;
}
*result = (char * ) malloc ( count);
for ( i = 0; i < size ; i++ )
if ( array[i] != 0 )
{
(*result) [pos++] = i + 'a';
}
return count;
}
int minStringSet ( char * minSet, int setNum ,int seq[])
{
int i = 0, j = 0, count = 0, c = 0;
int pos = 0 , spos = 0;
char * expand_set = NULL;
for ( i = 0 ; i < 26 ; i ++ )
{
if ( seq[ i ] == 0 )
continue;
else
count = seq[ i] ;
expand_set = (char * ) malloc ( setNum + count );
for ( j = 1; j < count; j++ )
{
pos = spos = 0;
for ( c = 0 ; c< setNum + count ; c++ )
expand_set[c ] = 0;
for ( c = 0 ; c < setNum; c++ )
expand_set[pos++] = minSet [ spos++];
for ( c = 0 ; c< j ; c++ )
expand_set [pos++] = i +'a';
permute( expand_set, 0, setNum + j ,string);
}
free ( expand_set );
}
return 0;
}
void main ()
{
char * result = NULL;
int count = 0;
seq_calculate (seq, string, 5 );
count = minCharSet( seq,26, &result);
minStringSet(result, count, seq);
system("pause");
}
对比较多的字符集还没有进行测试,如xdspower() 所说,复杂度太高,不知大家还有没有其他的方法
xdspower
2005-04-11
打赏
举报
回复
枚举所有的?不大可能吧,空间和时间的复杂度都太高了.
xdspower
2005-04-10
打赏
举报
回复
123 45678 90ABCDE 234
比如这个串,最优串应该是1234567890ABCDE,但因为你只能确定一个添加模式,就可能构造的不是最优(小)串,比如构造成 4567890ABCDE1234所以在串很多的时候找出最优化的串是不可能的.
xdspower
2005-04-10
打赏
举报
回复
yinhongquan() 算法可以找到比较小的串,但不是最小串,而且对于很多情况,找出最小串可以说是不可能的,太复杂了,特别是串特别多的时候.不过构造一个策略来大大减少最终串的长度还是可能的.这就是yinhongquan() 的策略.
lrping
2005-04-10
打赏
举报
回复
1.找一个最长的串A;
2.在剩下的所有串中找到最长的串记为A1;
3.判断A1是否为A的子串,若是,转2,否则执行4;
4.在A1中找到最长子串A':A'为A1的开始子串且为A的结束子串,或者A'为A1的结束子串且为A的开始子串;
5.将A1中除了A'以外的另一部分子串加在A的结尾或者开始处。转2
直到所有字符串处理完毕;
这样找到的应该就是最短的。
szws
2005-04-09
打赏
举报
回复
一楼的大哥好像没理解题目的意思。
不是求包含所有字符的最小字符串,而是包含所有字符串的。
二楼的算法好像有点对,我试试吧!!
yinhongquan
2005-04-09
打赏
举报
回复
可不可以采用另外一种方法:
1。将quaster(quaster)代码中的二维数组str中长度最长的一个作为基本串,
2。将str中其他的字符串在基本串中进行查找,如果查找不到,则在基本串的头部查找从查找串尾部向前连续最大交集和从基本串尾部查找从查找串头部开始的最大交集,两者那个交集比较大,则在那个位置补充完整查找串。
3。重复第二步,直至所有子串。
quaster
2005-04-09
打赏
举报
回复
#include <stdio.h>
#include<conio.h>
int main()
{ char *str[3]={"a","bc","ca"},strshort[100]="",*p,c;
int i,j=0,result,k;
clrscr();
for(i=0;i<3;i++)/*三个字符串分别查找*/
{
p=str[i];
while((c=*p++)!='\0')/*查找每一个字符串*/
{
for(k=0,result=0;k<=j;k++)
{
if(c==strshort[k])
{
result=1;break;
}
}
if(result==0)
strshort[j++]=c;
}
}
printf("%s\n",strshort);
getch();
}
【
算法
】三道
算法
题
两道
难度
中等一道困难
上一篇是
算法
题
目接下来继续学习下
算法
题
,用Java解答,可能更能激发一下大脑
思考
。
2020最新-精选基础
算法
100
题
(面试必备)
0x01.概述 作为一个程序员,
算法
能力必不可少,虽然不一定是
算法
工程师,但是
算法
还是彰显着个人的编码能力,面试中也经常会被问到,甚至会被要求临场做
算法
题
,所以,还是好好积累吧。 个人其实对
算法
挺有兴趣的,从3月份开始,陆陆续续刷了一些
算法
题
,把一些有意义的记录下来了,也顺便写了一些
题
解,个人认为,还是挺有收获的。 之前写了一篇
算法
文章的目录,不过后来就忘了实时去更新了,于是现在,想把之前做过的一些有意义的
算法
题
分享出来,刚好整理了100篇比较有意义的。希望对大家有所帮助。 0x02.说明 关
刷完 900 多道
算法
题
的首次总结:LeetCode 应该怎么刷?
LeetCode
算法
题
应该怎么刷?
算法
题
学习路线?怎么组队刷
题
?有没有
算法
刷
题
群? 你是怎么入门 LeetCode 的?刷完 1000 道
算法
题
是什么体验?大家都是怎么刷
题
的? 新手小白开始刷
算法
题
应该怎么刷,注意什么?刷 LeetCode 总是觉得太难怎么办? 刷
算法
题
有没有书籍推荐?该按照什么顺序刷
算法
题
?LeetCode 怎么看别人的
题
解?有哪些好的
算法
题
博主推荐?
(干货)分析下让大家比较头痛的
算法
题
的解
题
思路和技巧!
面试中纯粹考
算法
的问
题
一般是让很多程序员朋友痛恨的,这里分享下我对于解答
算法
题
的一些思路和技巧。 一般关于
算法
的文章,都是从经典
算法
讲起,一种一种
算法
介绍,见得
算法
多了,自然就有了感悟,但如此学习花费的时间和精力却是过于巨大,也不适合在博客里面交流。这一篇文,却是专门讲快捷思路的,很多人面对
算法
题
的时候几乎是脑子里一片空白,这一篇文章讲的就是从
题
目下手,把毫无思路的
题
目打开一个缺口的几种常见技巧。 另外本人整理收藏了20年多家公司面试知识点整理 ,以及各种Java核心知识点免费分享给大家,我认为对面试来说是
算法
题
的三大
题
型
大家好,我是前端西瓜哥,今天来聊
算法
。你去 LeetCode 刷
题
,你会发现
题
目会分为三大类。分别为:编程
题
找规律
题
算法
题
编程
题
编程
题
,就是纯编程的
题
目。这种
题
目不需要你有数据结构与
算法
知识,更像是开发工作中遇到的一些实际问
题
。
题
目讲的很清楚,要你实现什么功能,你不需要
思考
该用二叉树、动态规划来解还是什么的。思路通常都是简单明了的,一看就知道怎么去写。简单来说,就是用代码的方式翻译。但它的难点就在于它的边界条件很多,有些底层的方法要自己实现。比如 334
题
. 反转字符串,需要你自己实现一个反转方法,且不能
数据结构与算法
33,028
社区成员
35,337
社区内容
发帖
与我相关
我的任务
数据结构与算法
数据结构与算法相关内容讨论专区
复制链接
扫一扫
分享
社区描述
数据结构与算法相关内容讨论专区
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章