面試題------程式設計----正則表示式匹配
阿新 • • 發佈:2018-12-31
正則表示式匹配
題目描述:
JOBDU最近來了一個新員工Fish,每天早晨總是會拿著一本英文雜誌,寫些句子在本子上。同事Cat對Fish寫的內容頗感興趣,有一天他向Fish借來翻看,但卻讀不懂它的意思。例如,“student. a am I”。後來才意識到,這傢伙原來把句子單詞的順序翻轉了,正確的句子應該是“I am a student.”。Cat對一一的翻轉這些單詞順序可不在行,你能幫助他麼?
思路:
我們首先必須對正則表示式匹配這個概念瞭解清楚,此處我對它的理解還比較基礎,附上鍊接:
接下來我們討論針對這個題目的思路:
首先,考慮特殊情況: 1>兩個字串都為空,返回true 2>當第一個字串不空,而第二個字串空了,返回false(因為這樣,就無法 匹配成功了,而如果第一個字串空了,第二個字串非空,還是可能匹配成 功的,比如第二個字串是“a*a*a*a*”,由於‘*’之前的元素可以出現0次, 所以有可能匹配成功) 之後就開始匹配第一個字元,這裡有兩種可能:匹配成功或匹配失敗。但考慮到pattern 下一個字元可能是‘*’, 這裡我們分兩種情況討論:pattern下一個字元為‘*’或 不為‘*’: 1>pattern下一個字元不為‘*’:這種情況比較簡單,直接匹配當前字元。如果 匹配成功,繼續匹配下一個,pattern和字串都向後移動一個字元;如果匹配失敗,直接返回 false。注意這裡的“匹配成功”,除了兩個字元相同的情況外,還有一種情況,就是pattern的 當前字元為‘.’,同時str的當前字元不為‘\0’。 2>pattern下一個字元為‘*’時,稍微複雜一些,因為‘*’可以代表0個或多個。 這裡把這些情況都考慮到: a>當‘*’匹配0個字元時,str當前字元不變,pattern當前字元後移兩位, 跳過這個‘*’符號; b>當‘*’匹配1個或多個時,str當前字元移向下一個,pattern當前字元 不變。(這裡匹配1個或多個可以看成一種情況,因為:當匹配一個時, 由於字串str移到了下一個字元,而pattern字元不變;當匹配多於一個字元時,相當於 從str的下一個字元繼續開始匹配,pattern向後移動一個字元)
下面是我在牛客網編譯測試通過的:
class Solution { public: bool match(char* str, char* pattern) { if(str==NULL||pattern==NULL) return false; return matchCore(str,pattern); } bool matchCore(char* str, char* pattern) { if(*str=='\0'&&*pattern=='\0') return true; if(*str!='\0'&&*pattern=='\0') return false; if(*(pattern+1)=='*')//pattern下一個字元是‘*’ { if(*pattern==*str||(*pattern=='.'&&*str!='\0'))//是‘*’,並且匹配 /* matchCore(str,pattern+2):模式串未匹配 matchCore(str+1,pattern):模式串已經匹配成功,嘗試匹配下一個字串 matchCore(str+1,pattern+2):模式串已經成功匹配,並且不匹配下一個字串內容 */ return matchCore(str+1,pattern)||matchCore(str,pattern+2)||match(str+1, pattern+2); else return matchCore(str,pattern+2);//是‘*’,但是不匹配,模式串向後移動兩個字元 } else if(*str==*pattern||(*pattern=='.'&&*str!='\0'))//pattern的下一個不是‘*’,如果匹配,字串和模式串都向後移動一個字元 return matchCore(str+1,pattern+1); return false; } };