一、题目重述
【问题描述】输入一行字符串,该字符串只由小写英文字母a-z组成,且其中的字符可以重复,最长不超过10000个字符。
从该字符串中按顺序挑选出若干字符(不一定相邻)组成一个新串,称为“子串”。如果子串中每两个相邻的字符或者相等,或者后一个比前一个大,则称为“升序子串”。编程求出输入字符串的最长升序子串的长度。
例如,由输入字符串abdbch可以构成的升序子串有:abd、abch、bbch、abbch等。其中最长的升序子串是abbch,其长度为5。
【输入形式】从标准输入读取一行字符串,该串不含空格,以回车符结束。
【输出形式】向标准输出打印一个正整数,是字符串中最长的升序子串的长度,在行末要输出一个回车符。
【输入样例】abdbch
【输出样例】5
【样例说明】abdbch中最长子串是abbch,长度是5。
【评分标准】结果完全正确得20分,每个测试点4分。上传c语言源程序为up.c。
二、算法介绍
【问题描述】输入一行字符串,该字符串只由小写英文字母a-z组成,且其中的字符可以重复,最长不超过10000个字符。
从该字符串中按顺序挑选出若干字符(不一定相邻)组成一个新串,称为“子串”。如果子串中每两个相邻的字符或者相等,或者后一个比前一个大,则称为“升序子串”。编程求出输入字符串的最长升序子串的长度。
例如,由输入字符串abdbch可以构成的升序子串有:abd、abch、bbch、abbch等。其中最长的升序子串是abbch,其长度为5。
【输入形式】从标准输入读取一行字符串,该串不含空格,以回车符结束。
【输出形式】向标准输出打印一个正整数,是字符串中最长的升序子串的长度,在行末要输出一个回车符。
【输入样例】abdbch
【输出样例】5
【样例说明】abdbch中最长子串是abbch,长度是5。
【评分标准】结果完全正确得20分,每个测试点4分。上传c语言源程序为up.c。
二、算法介绍
这道题大家都不太会做这个可以理解,当年我也没独立地做出来这道题。
我们可以想象,如果能过穷举所有可能的子串,然后找出最大的那个不就可以了吗?假设我们的字符串有n个字符,那么所有的子串就有2^n那么多,也就是说穷举的时间复杂度是O(2^n),找最大值可以在穷举的过程中顺便进行,所以这个算法的时间复杂度就是O(2^n)。相信你一定可以想象,这个时间复杂度是十分糟糕的。
说到这里,提一下“NP完全问题”。无论是通过理论还是通过实验,我们都发现对于一个指数时间复杂度的算法,即使是问题规模比较小的情况下也需要相当长的时间来求解,并且随着问题规模的增长,这个时间会飞速的上升