字串 》回文問題 編輯距離問題

2021-10-07 02:59:05 字數 3418 閱讀 8271

catcher 是mca國的情報員,他工作時發現敵國會用一些對稱的密碼進行通訊,比如像這些abba,aba,a,123321,但是他們有時會在開始或結束時加入一些無關的字元以防止別國破解。比如進行下列變化 abba->12abba,aba->abakk,123321->51233214 。因為截獲的串太長了,而且存在多種可能的情況(abaaab可看作是aba,或baaab的加密形式),cathcer的工作量實在是太大了,他只能向電腦高手求助,你能幫catcher找出最長的有效密碼串嗎?

(注意:記得加上while處理多個測試用例)

輸入乙個字串

返回有效密碼串的最大長度

abba
4
回文串即一串對稱的字串,根據這個特徵,可以看出這串字串排列順序顛倒時與原來字串相同(字串順序顛倒與原有的字串相同)!!!!!

證明:如果新增了乙個字母,最大回文串的長度增加了3,這是不可能的!!!

例如:abcdefgfedcba,當增加到最後的b或者a時,新回文串比原有的回文串長度大2;abbb,當增加b時,新回文串比原有的回文串長度大1.

所以,從頭到尾掃瞄字串,每增加乙個新的字元,判斷以這個字元結尾,且長度為maxlen+1或者maxlen+2的子串是否為回文,如果是,更新最大回文子串。(注意要判斷輸入是否為空,如果為空就不要輸出0了。。被坑過一次。)**如下:

# def longestpalindrome(s):

# if s==s[::-1]:return len(s)

# maxlen=0

# for i in range(len(s)):

# if i-maxlen>=1 and s[i-maxlen-1:i+1]==s[i-maxlen-1:i+1][::-1]:

# maxlen+=2

# elif i-maxlen>=0 and s[i-maxlen:i+1]==s[i-maxlen:i+1][::-1]:

# maxlen+=1

# return maxlen

# while true:

# try:

# a=input()

# if a:

# print(longestpalindrome(a))

# #

# except:

# break

def longestpalindrome(s):

if s == s[::-1]:return len(s)

maxlen = 0 # 回文最大長度

for i in range(len(s)):

if s[i - maxlen:i + 1] == s[i - maxlen:i + 1][::-1]:

maxlen += 1

elif i - maxlen >= 1 and s[i - maxlen - 1:i + 1] == s[i - maxlen - 1:i + 1][::-1]:

maxlen += 2

return maxlen

while true:

try:

a = input()

if a:

print(longestpalindrome(a))

except:

break

將原有字串順序取反,判斷原有字串中是否存在乙個子串存在於順序取反的字串中,若存在在返回!!!

注意:由於是求取最大回文長度,所以獲取子串時,應該以長度從大到小獲取,以減少程式運算複雜度!!!

def longestpalindrome(s):

s_ = s[::-1]

for i in range(1, len(s) + 1)[::-1]:

for j in range(0, len(s) - i + 1):

temp = s[j:j + i]

if temp in s_:

return len(temp)

while true:

try:

a = input()

if a:

print(longestpalindrome(a))

except:

break

以上解法重點是取字串公共部分:j:j+i

以上兩種解決回文問題,推薦解法一,解法二中由於是兩層迴圈,當回文子串很短時,程式執行時間會很長!!!!!!

levenshtein 距離,又稱編輯距離,指的是兩個字串之間,由乙個轉換成另乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪除乙個字元。編輯距離的演算法是首先由**科學家levenshtein提出的,故又叫levenshtein distance。

ex:字串a:abcdefg

字串b: abcdef

通過增加或是刪掉字元」g」的方式達到目的。這兩種方案都需要一次操作。把這個操作所需要的次數定義為兩個字串的距離。

/*  功能:計算兩個字串的距離

*  輸入: 字串a和字串b

*  輸出:無

*  返回:如果成功計算出字串的距離,否則返回-1

*/publicstaticintcalstringdistance (string chara, string  charb)

輸入兩個字串

得到計算結果

abcdefg

abcdef

1
編輯距離理解 :

def editdistance(str1, str2):

edit = [[i + j for j in range(len(str2) + 1)] for i in range(len(str1) + 1)]

for i in range(1, len(str1) + 1):

for j in range(1, len(str2) + 1):

edit[i][j] = min(edit[i - 1][j] + 1, edit[i][j - 1] + 1, edit[i - 1][j - 1] + (str1[i - 1] != str2[j - 1]))

return edit[len(str1)][len(str2)]

try:

while true:

print(editdistance(input(), input()))

except:

pass

編輯字串距離

題目 題意 編輯距離,又稱levenshtein距離 也叫做edit distance 是指兩個字串之間,由乙個轉成另 乙個所需的最少編輯操作次數。許可的編輯操作包括將乙個字元替換成另乙個字元,插入乙個字元,刪 除乙個字元。例如將kitten轉化成sitting sitten k s sittin ...

字串編輯距離

題目描述 給定乙個源串和目標串,能夠對源串進行如下操作 在給定位置上插入乙個字元 替換任意字元 刪除任意字元 寫乙個程式,返回最小運算元,使得對源串進行這些操作後等於目標串,源串和目標串的長度都小於2000。關於字串最短編輯距離的解題思路 給定相關資料的定義 mep i j 表示源字串source ...

字串編輯距離

給出兩個單詞word1和word2,寫乙個函式計算出將word1 轉換為word2的最少操作次數。你總共三種操作方法 1 插入乙個字元 2 刪除乙個字元 3 替換乙個字元 格式 輸入行輸入兩個字串 word1 和 word2,最後輸出將 word1 轉換為 word2的最少操作次數 樣例輸入 wor...