算法4------字符串的字典序最長子序列


題目:

對於字符串a和b,如果移除字符串a中的一些字母(可以全部移除,也可以一個都不移除)就能夠得到字符串b,則b為a的子序列。例如,‘heo'為'hello'的子序列,’le'不是。

對於給定的一個字符串s,請計算出s的字典序最大的子序列。

輸入:輸入包括一行,一個字符串s,字符串s長度length(1<=length<=50),s中每個字符串都是小寫字母

輸出:輸出字符串,即s的字典序最大的子序列。

例如:‘test'輸出:’tt'            'string' 輸出 ‘trng'        'bike'輸出'ke'

解法1:逆序排序,輸出原來的索引值,保留上升的索引值,輸出原來字符串對應索引值的子序列。

如:s='test',排序之后,s='ttse',索引應該是(0,3,2,1),0到3是升序,到2,1是降序,輸出:(0,3)對應的(’tt')
再如:s='string',排序:s='tsrnig',索引(1,0,2,4,3,5)輸出:(1,2,4,5)對應的(‘trng')
def Sublist(s):
    '''
    type(s)=string
    '''
    value_s=list(s)
    key_s=range(len(s))
    dic=dict(zip(key_s,value_s))
#字典逆序排序
    sort_dic=sorted(dic.items(),key=lambda x:x[1],reverse=True)
    key=[]
    value=[]
    for item in sort_dic:
        key.append(item[0])
        value.append(item[1])
#獲得逆序后的索引值
    cur=key[0]
    k=0
    for i in range(len(key)):
        if key[i-k]>=cur:
            cur=key[i-k]
        else:
            del key[i-k]
            k+=1
#返回對應索引的原字符串子序列
    res=[]
    for i in key:
        res.append(value_s[i])
    return str(res)

解法2:逆向查找字符串,若前面的字符比后面一個大,則保留前面的字符,否則把它刪除。

def Subdic(s1):
    s=list(s1)
    s.reverse()
    k=0
    for i in range(len(s)-1):
        if s[i-k]>s[i+1-k]:
            del s[i+1-k]
            k+=1
    s.reverse()
    return str(s)

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM