匹配兩個字串中的相同部分 並找出最長的相同部分

2021-09-24 07:12:46 字數 2980 閱讀 5517

閒來無事,看到別人說的面試題讓取到裡兩個字串最長匹配的字串,於是就想試試,自己搗鼓了一下,方法挺笨的,就是for迴圈遍歷,沒有想到其他簡便的思路,但是效果還是能實現的。

再詳細說一下題目:取到裡兩個字串最長匹配的字串,可能有些人不是很明白什麼意思。比如現在有兩個字串:

nsstring *str1 = @"qwe不重要的文字ty";

nsstring *str2 = @"哈qwe這也是ty";

複製**

其中匹配的重複的字串內容就是qwety,那麼兩個字串中最長匹配的字串就是qwe

沒有想到好的方法,只能用最笨的方法:用for迴圈遍歷。

比如兩個字串:

nsstring *str1 = @"qwe不重要的文字ty";

nsstring *str2 = @"哈qwe這也是ty";

複製**

先取str1的第乙個字元q,判斷str2是否包含q,如果包含繼續取str1的第二個字元(即w),與str2q後面的那個字元(即w)進行比較是否相等,以此類推直到str1中取出的字元與str2中取出的字元不相等,即str1中第四個字元str2中從q開始第四個字元不等,此時找到兩個字串中相同的字串內容為str1qe的這部分,也即qwe,按字串的range來說就是

這一邊遍歷找出相同內容qwe後,擷取str2字元q後面的部分即@"we這也是ty",按照上一步的方法繼續遍歷,直至找出str2所有與str1中q開始的相同的部分。

然後再中str1w開始與str2迴圈遍歷進行比較。

通過兩個字串的迴圈遍歷,可以找出所有相同的字串內容,然後再從所有相同的字串中找出最長的那個字串,就是我們要找的最長匹配字串

具體過程都在上面大概的說明了,下面直接貼出實現**,方便理解。

- (void)viewdidload 

複製**

-(nsarray *)matchlongestsubstrings:(nsstring *)str1 with:(nsstring *)str2 

// 去掉重複的資料

nsset*matchingstrset = [nsset setwitharray:matchingstrarr];

matchingstrarr = [matchingstrset allobjects];

// 陣列內字串按length降序排列

matchingstrarr = [matchingstrarr sortedarrayusingcomparator:^nscomparisonresult(id _nonnull obj1, id _nonnull obj2) ];

nsinteger longestlength = matchingstrarr.firstobject.length;

__block nsarray *longeststrarr = [nsarray array];

[matchingstrarr enumerateobjectsusingblock:^(nsstring * _nonnull obj, nsuinteger idx, bool * _nonnull stop)

else

}];return longeststrarr;

}複製**

-(nsarray *)comparestr1:(nsstring *)str1 tostr2:(nsstring *)str2 withcharacterstring:(nsstring *)s indexinstr1:(nsuinteger)i

nsrange rangeofstr2 = [str2 rangeofstring:s];

nsmutablearray *longeststrarr = [nsmutablearray array];

for (nsuinteger j = rangeofstr2.location, ii = i; j < str2.length && ii < str1.length; j++, ii++)

}else

}if (str2.length <=1)

str2 = [str2 substringfromindex:1];

if (str2.length>1)

return longeststrarr;

}複製**

最後輸出結果:

最長的字串:

複製**

使用陣列輸出,是為了防止最長的重複內容有不止一段,比如兩個字串為:

nsstring *str1 = @"qwe不重要的文字tyt";

nsstring *str2 = @"哈qwe這也是tyt";

複製**

輸出結果為:

最長的字串:

複製**

如有bug,歡迎指出。

查詢兩個字串中相同字元

for 歷遍第乙個字串的字元,過程中用 in 檢測字元是否存在於第二個字串中。若是在則將其新增在列表中。一 函式檔案 def intersect seq1,seq2 定義交集函式,函式名及變數 res 定義空列表用來盛放相同字元 for x in seq1 歷遍字串1 if x in seq2 歷遍...

iOS演算法 找兩個字串中相同字串的最大長度

nsstring str1 qwe不重要我愛你的人的文字ty nsstring str2 哈qwe這也我愛你的人是ty nsarray arr selfmatchlongestsubstrings str1 with str2 nslog 最長的字串 arr nsarray matchlongest...

判斷兩個字串是否相同

data segment mess1 db computer software mess2 db computer software data ends code segment assume ds data,cs code start mov ax,data mov ds,ax mov es,ax...