document.write('
方法一:顺序遍历法最直观的思路就是首先遍历一次字符串,找出最大的字符ai,接着从ai开始遍历再找出最大的字符,依此类推直到字符串长度为
0。
以“acbdxmng”为例,首先对字符串遍历一遍找出最大的字符‘x’,接着从‘m’开始遍历找出最大的字符‘n’,然后从‘g’开始遍历找到最
大的字符为‘g’,因此“acbdxmng”的最大子序列为“xng”。实现代码如下:
#方法功能: 求串中字典序最大的子序列
def getLargestSub(src):
if src==None:
return None
lens=len(src)
largestSub=[None]*(lens+1)
k=0
i=0
while i<lens:
largestSub[k]=list(src)[i]
j=i+1
while j<lens:
#找出第i个字符后面最大的字符放到largestSub[k]中
if list(src)[j]>largestSub[k]:
largestSub[k]=list(src)[j]
i=j
j+=1
k+=1
i+=1
return ".join(largestSub[0:k])
if __name__=="__main__":
s="acbdxmng"
result=getLargestSub(s)
if result==None:
print "字符串为空"
else:
print result
程序的运行结果为:
xng
算法性能分析:
这种方法在最坏的情况下(字符串中的字符按降序排列)时间复杂度为O(n2
);在最好的情况下(字符串中的字符按升序排列)时间复杂度为O(n)。此外这
种方法需要申请n+1个额外的存储空间,因此,空间复杂度为O(n)。
方法一:逆序遍历法
通过对上述运行结果进行分析,发现an-1一定在所求的子串中,接着逆序遍历字符串,大于或等于an-1的字符也一定在子串中,依次类推,一直往前
遍历,只要遍历到的字符大于或等于子串首字符,就把这个字符加到子串首。由于这种方法首先找到的是子串的最后一个字符,最后找到的是子串的第
一个字符,因此,在实现的时候首先按照找到字符的顺序把找到的字符保存到数组中,最后再对字符数组进行逆序,从而得到要求的字符。
以”acbdxmng”为例,首先,字符串的最后一个字符‘g’一定在子串中,接着逆向遍历找到大于或等于‘g’的字符‘n’加入到子串中“gn”(子
串的首字符为‘n’),接着继续逆向遍历找到大于或等于‘n’的字符‘x’加入到子串中“gnx”,接着继续遍历,没有找到比‘x’大的字符。最后
对子串“gnX”逆序得到“xng”。实现代码如下:
def getLargestSub(src):
if src==None:
return None
lens=len(src)
largestSub=[None]*(lens+1)
#最后一个字符一定在子串中
largestSub[0]=list(src)[lens-1]
i=lens-2
j=0
#逆序遍历字符串
while i>0:
if ord(list(src)[i])>=ord(largestSub[j]):
j+=1
largestSub[j]=list(src)[i]
i-=1
#largestSub[j+1]="
largestSub-largestSub[0:j+1]
#对子串进行逆序
i=0
while i<j:
tmp=largestSub[i]
largestSub[i]=largestSub[j]
largestSub[j]=tmp
i+=1
j-=1
return ".join(largestSub)
if __name__=="__mam__":
s="acbdxmng"
result=getLargestSub(s)
if result==None:
print "字符串为空"
else:
print result
算法性能分析:
这种方法只需要对字符串遍历一次,因此,时间复杂度为O(n)。此外,这种方法需要申请n+1个额外的存储空间,因此空间复杂度为O(n)。
');