最長連續(xù)遞增字符串

題目:

輸入一段字符串(由字母構成),找出這段字符串中連續(xù)的最長的遞增字符。

舉例:
字符串:eahcu
結果:acu, ahu, ehu


思路:

本題有兩種思路求解,一種是遞歸的形式,首先找到最后一位字符,將其加入到結果集中,然后需要進行兩步查找:

一步是找大于結果集中第一位字符的字符,并將該字符加入到結果集中。

另一步是將小于結果集中第一位字符的字符加入到結果集中指定的字符串中,從而更新結果集。

還有一種方法是動態(tài)規(guī)劃的方法。
動態(tài)規(guī)劃最重要的就是找到狀態(tài)方程和狀態(tài)數(shù)組。狀態(tài)數(shù)組中每個數(shù)字代表的意義是從字符串首位到當前字符遞增序列的最長長度。之后是狀態(tài)方程,一旦發(fā)現(xiàn)當前字符大于之前的某個字符則更新當前字符的狀態(tài)值,更新為大于的字符的狀態(tài)值加上1。

在更新狀態(tài)值的過程中也需要更新子字符串。一旦當前字符大于之前的某個字符ch,則更新子字符,將所有狀態(tài)值小于當前字符狀態(tài)值的子字符串加上當前字符。最后取長度最大的子字符串。


代碼:

遞歸:

def longestConsective(str):
    if len(str) == 1:
        return {str}
    results = longestConsective(str[1:])
    solution = set(results)
    if all(chr[0] < str[0] for chr in results):
        solution.add(str[0])
    solution.update(str[0] + chr for chr in results if str[0] < chr[0])
    return solution

if __name__ == '__main__':
    str = input('Please input the string: ')
    results = longestConsective(str)
    max_len = max(len(str) for str in results)
    ares = sorted(result for result in results if len(result) == max_len)
    print(ares)

動態(tài)規(guī)劃:

def dplongestConsective(str):
    '''
    Find longest consecutive string by dynamic programming.
    :param str: 
    :return: 
    '''
    if not str:
        return ''
    solution = [(1, {str[i]}) for i in range(len(str))]
    max_length = 1
    for i in range(1, len(str)):
        length_so_far = 1
        for j in range(i):
            length, good_words = solution[j]
            if length < length_so_far - 1:
                continue
            if str[j] > str[i]:
                continue
            if length == length_so_far - 1:
                solution[i][1].update(w + str[i] for w in good_words)
            else:
                length_so_far = length + 1
                solution[i] = length_so_far, {w + str[i] for w in good_words}
            max_length = max(max_length, length_so_far)
    return sorted(w for (length, set_of_words) in solution if length == max_length
                  for w in set_of_words)
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • 官網(wǎng) 中文版本 好的網(wǎng)站 Content-type: text/htmlBASH Section: User ...
    不排版閱讀 4,716評論 0 5
  • 第5章 引用類型(返回首頁) 本章內容 使用對象 創(chuàng)建并操作數(shù)組 理解基本的JavaScript類型 使用基本類型...
    大學一百閱讀 3,679評論 0 4
  • 1. Java基礎部分 基礎部分的順序:基本語法,類相關的語法,內部類的語法,繼承相關的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,734評論 18 399
  • 每月一次的上海之行,總是讓我倦怠而又興奮。 臨行前倦怠地一拖再拖,這兩年因工作地點換到老家,倒喜歡上了家里的舒適和...
    我在安好閱讀 359評論 0 2
  • React和React-native在編程的思想上是完全一樣的,所以要寫出好的RN代碼,學學React的思想很有必...
    黃怡菲閱讀 578評論 0 3

友情鏈接更多精彩內容