Python程序员面试算法宝典---解题总结: 第5章 字符串 5.17 如何求解字符串中字典序最大的子序列

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第5章 字符串 5.17 如何求解字符串中字典序最大的子序列

题目:
给定一个字符串,求串中字典序最大的子序列。字典序最大的子序列是这样构造的:
给定字符串a0a1...an-1,首先在字符串a0a1...an-1中找到值最大的字符ai,
然后在剩余字符串ai+1..an-1中找到值最大的字符aj然后在剩余的aj+1...an-1
中找到值最大的字符ak...直到字符串的长度为0,则aiajak...即为答案。


分析:
最简单的方式,遍历字符串,记录最大的字符,然后对剩余字符串
进行遍历,记录最大字符,直到字符串为空。
或者自己设计一个排序算法,记录每个字符的下标,
排序算法按照字符的值从大到小排序。

关键:
1 书上解法
逆序遍历字符串。根据题目的要求字符串的最后一个字符必定在所求结果中。
那么继续从后向前查找到第一个大于刚才最后一个字符的元素加入到结果字符串尾部,
以此类推,得到结果字符串,最后在逆序即可

2 没有想到
是因为没有考虑到最后一个元素必然在结果列表中,
然后逆序寻找即可

参考:
Python程序员面试算法宝典
'''

def getLargestSub(string):
    if not string:
        return
    size = len(string)
    i = size - 2
    charSet = [string[size - 1]]
    while i >= 0:
        while i >= 0 and ord(string[i]) < ord(charSet[-1]):
            i -= 1
        if i < 0:
            break
        charSet.append(string[i])
        # 遍历下一个字符
        i -= 1

    charSet.reverse()
    result = ''.join(charSet)
    return result


def process():
    string = 'acbdxmng'
    result = getLargestSub(string)
    print result
    string = 'abc'
    result = getLargestSub(string)
    print result
    string = 'cba'
    result = getLargestSub(string)
    print result


if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)