請實現乙個函式用來匹配包括'.'和'*'的正規表示式。模式中的字元'.'表示任意乙個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配
/*
解這題需要把題意仔細研究清楚,反正我試了好多次才明白的。
首先,考慮特殊情況:
1>兩個字串都為空,返回true
2>當第乙個字串不空,而第二個字串空了,返回false(因為這樣,就無法
匹配成功了,而如果第乙個字串空了,第二個字串非空,還是可能匹配成
功的,比如第二個字串是「a*a*a*a*」,由於『*』之前的元素可以出現0次,
所以有可能匹配成功)
之後就開始匹配第乙個字元,這裡有兩種可能:匹配成功或匹配失敗。但考慮到pattern
不為『*』:
匹配成功,繼續匹配下乙個;如果匹配失敗,直接返回false。注意這裡的
「匹配成功」,除了兩個字元相同的情況外,還有一種情況,就是pattern的
當前字元為『.』,同時str的當前字元不為『\0』。
2>pattern下乙個字元為『*』時,稍微複雜一些,因為『*』可以代表0個或多個。
這裡把這些情況都考慮到:
a>當『*』匹配0個字元時,str當前字元不變,pattern當前字元後移兩位,
跳過這個『*』符號;
b>當『*』匹配1個或多個時,str當前字元移向下乙個,pattern當前字元
不變。(這裡匹配1個或多個可以看成一種情況,因為:當匹配乙個時,
由於str移到了下乙個字元,而pattern字元不變,就回到了上邊的情況a;
當匹配多於乙個字元時,相當於從str的下乙個字元繼續開始匹配)
之後再寫**就很簡單了。
*/class solution
else
}};
剛好匹配的情況,當然包括了兩個串都是空的情況和兩個串迭代之後完全匹配的情況。
當模式串為空,但是原串還有未匹配部分,顯然這種情況要返回0;
剩餘的**上的解釋已經很清楚了。
請實現乙個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1e-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。
class solution
else if(string[i]=='+'||string[i]=='-')
else if(string[i]>'9'||string[i]<'0') return 0;
}return 1;
}};
其關鍵是對各個特殊字元(』+『、』-『、』e『、』e『、』.『)出現的位置和狀態情況進行不同的考慮。已經最大可能考慮了盡可能多的情況,可能有遺漏。
參考:
劍指offer 字串
問題描述 class solution auto res temp.c str strcpy str,res strcpy 關於c 中string和char 的區別參考 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含0...
劍指offer 字串
問題描述 function replacespace str 問題描述 請實現乙個函式用來匹配包括 和 的正規表示式。模式中的字元 表示任意乙個字元,而 表示它前面的字元可以出現任意次 包含 0 次 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串 aaa 與模式 a.a 和 ab ac a...
劍指offer 字串
c c 中每個字串都以字元 0 作為結尾,這樣我們就可以很方便的找到字串最後的尾部。由於這個特點,每個字串中都有乙個額外字元的開銷,稍不留神就會造成字串的越界。為了節省記憶體,c c 把常量字串放到單獨的乙個記憶體取餘。當幾個指標賦值給相同的常量字串時,它們實際上會指向相同的記憶體位址。int ma...