document.write('
方法一:最长公共子串法
对序列L=<a1,a2,...,an>按递增进行排序得到序列LO=<b1,b2,...,bn>。显然,L与LO的最长公共子序列就是L的最长递增子序列。因此,可以使用
求公共子序列的方法来求解。
方法二:动态规划法
由于以第i个元素为结尾的最长递增子序列只与以第i-1个元素为结尾的最长递增子序列有关,因此,本题可以采用动态规划的方法来解决。下面首先
介绍动态规划方法中的核心内容递归表达式的求解。
以第i个元素为结尾的最长递增子序列的取值有两种可能:
(1)1,第i个元素单独作为一个子串(L[i]<=L[i-1]);
(2)以第i-1个元素为结尾的最长递增子序列加1(L[i]>L[i-1])。
由此可以得到如下的递归表达式:假设maxLen[i]表示以第i个元素为结尾的最长递增子序列,那么
(1)maxLen [i]=max[1, maxLen [j]+1], j<i and L[j]<L[i]
(2)maxLen[0]=1
根据这个递归表达式可以非常容易地写出实现的代码:
#函数功能: 求字符串L的最长递增子串的长度
def getMaxAscendingLen(strs):
lens=len(strs)
maxLen=[None]*lens
maxLen[0]=1
maxAscendingLen=1
i=1
while i<lens:
maxLen[i]=1# maxLen[i]的最小值为1;
j=0
while j<i:
if list(strs)[j]<list(strs)[i] and maxLen[j]>maxLen[i]-1:
maxLen[i]=maxLen[j]+1
maxAscendingLen=maxLen[i]
j+=1
i+=1
return maxAscendingLen
if __name__=="__main__":
s="xbcdza"
print "最长递增子序列的长度为:"+str(getMaxAscendingLen(s))
程序的运行结果为:
xbcdza最长递增予序列的长度为:4
算法性能分析:
由于这种方法用双重循环来实现,因此,这种方法的时间复杂度为O(N2),此外由于这种方法还使用了N个额外的存储空间,因此,空间复杂度为O(N)。
');