牛客網劍指offer第52題 正規表示式

2022-05-02 13:42:07 字數 1456 閱讀 8746

題目:

請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配

可以說這是目前遇到最難的題目了。

這個題目要我們幹什麼?答:考慮了 『*』和'.'的作用後,兩個字串完全相同。

那麼問題來了:如何判斷兩個字串相等?方案一:兩個字串的每個字元相等;方案二:兩個字串的字元指標都能移動到最後,指向'\0'。

可以說,我們大部分的思路都是第乙個,然後這道題由於兩個特殊字元的出現,使得這種考慮變得很複雜。

其實應該考慮方案二:

我們這樣想:假如兩個字串,aaba,aaaa。我們知道這兩個字串不一樣,但是我們是如何判斷的。我們看到了第乙個字串和第二個字串第乙個不相等的字元出現在字串中,分別是b ,a。仔細想想,假如,我們首先判斷aaba,aaaa;由於a = a;兩個字串變成了aba,aaa;繼續,變成了 ba,aa;也就是我們總是在縮小問題的規模,如果第乙個字元相等,我們就不再考慮這個字元,將後續的字串當作新的要判斷的字串,這是什麼——分治——如何解決?,遞迴!!!!

有兩篇講的非常好的部落格:

講的非常清楚!!!

思路:首先看到這個題我們要考慮到用遞迴較容易,思路比較清晰。

(大家也可以嘗試非遞迴,說不定我後面會寫,用乙個二維字串組來儲存結果,可以試一下非遞迴,我估計有文章會寫這個題,也算是對動態規劃的練習)

1》一說 到遞迴,我們先考慮出口:

(1)字串str 和模式pattern都走到了最後的『\0』處,說明全匹配,返回true.

(2)字串str還未到』\0』處,但是pattern已經到了『\0』處,說明不匹配,返回false。

2》當模式中的第二個字元不是「*」時:

(1)如果字串第乙個字元和模式中的第乙個字元相匹配,那麼字串和模式都後移乙個字元,然後匹配剩餘的。

(2)如果 字串第乙個字元和模式中的第乙個字元相不匹配,說明存在不匹配項,直接返回false。

3》而當模式中的第二個字元是 『※』 時:

(1)如果字串第乙個字元跟模式第乙個字元匹配,可能有3種匹配方式:

1>模式後移2字元,相當於x※被忽略;

2>字串後移1字元,模式後移2字元;

(這個第二個方式,如果你看的比較懂,其實可以讓1>和3>組合代替,先3>再1> 就可代替2>。但是寫著的話,更清晰。)

3>字串後移1字元,模式不變,即繼續匹配字元下一位,因為*可以匹配多位;

(2)如果字串第乙個字元跟模式第乙個字元不匹配,則模式後移2個字元,繼續匹配。

class

solution

//而當模式中的第二個字元是 『*』 時

else

}};

第二篇部落格中講解了動態規劃的解法

牛客網 劍指Offer(66題)

1 在乙個二維陣列中 每個一維陣列的長度相同 每一行都按照從左到右遞增的順序排序,每一列都按照從上到下遞增的順序排序。請完成乙個函式,輸入這樣的乙個二維陣列和乙個整數,判斷陣列中是否含有該整數。方法一 直接遍歷二維陣列 public class solution find 8,a public st...

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...

牛客網 劍指Offer 索引

二維陣列中的查詢 替換空格 從尾到頭列印鍊錶 重建二叉樹 用兩個棧實現佇列 旋轉陣列的最小數字 斐波那契數列 跳台階 跳台階 矩形覆蓋 二進位制中1的個數 數值的整數次方 調整陣列順序使奇數字於偶數前面 鍊錶中倒數第k個結點 反轉鍊錶 合併兩個排序的鍊錶 樹的子結構 二叉樹的映象 順時針列印矩陣 包...