1. 程式人生 > >劍指Offer-字串的匹配

劍指Offer-字串的匹配

題目:

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

思路:

假設字串為str,模式串為pattern,考慮以下情況:

A. 模式串下一個字元為*,即*(pattern+1)=='*':

如果當前字元匹配,即*str=*pattern或者*str='.' && *pattern!='\0',三種可能:

 1、模式串當前字元出現0次,即*表示當前字元出現0次,則str=str,pattern=pattern+2;

 2、模式串當前字元出現1次,即*表示當前字元出現1次,則str=str+1,pattern=pattern+2;

 3、模式串當前字元出現2次或2次以上,即*表示當前字元出現2次或以上,則str=str+1,pattern=pattern;

如果當前字元不匹配,則只能讓*表示當前字元出現0次,則str=str,pattern=pattern+2;

B. 模式串下一個字元不為*

如果當前字元匹配,即*str=*pattern或者*str='.' && *pattern!='\0',則str=str+1,pattern=pattern+1.

程式碼:

1234567891011121314151617181920212223242526272829303132333435363738394041#include <iostream>using namespace std;bool RegMatchCore(const char* str, const char* pattern){if(*str=='\0' && *pattern=='\0')return true;if(*str!='\0' && *pattern=='\0')return false;if(*(pattern+1)=='*'){if(*str==*pattern || (*str!='\0' && *pattern=='.'))return RegMatchCore(str,pattern+2) || RegMatchCore(str+1,pattern+2) || RegMatchCore(str+1,pattern);
else// ignore *return RegMatchCore(str,pattern+2);}if(*str==*pattern || (*str!='\0' && *pattern=='.'))return RegMatchCore(str+1,pattern+1);return false;}bool RegMatch(const char* str, const char* pattern){if(str==NULL || pattern==NULL)return false;return RegMatchCore(str,pattern);}int main(){char str[] = "aaa";char pattern1[]="ab*ac*a";char pattern2[]="ab*a";cout << RegMatch(str,pattern1) << endl;cout << RegMatch(str,pattern2) << endl;return 0;}

線上測試OJ:

http://www.nowcoder.com/books/coding-interviews/45327ae22b7b413ea21df13ee7d6429c?rp=3

AC程式碼:

123456789101112131415161718192021

相關推薦

Offer-字串匹配

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

Offer字串轉換成整數

題目描述 將一個字串轉換成一個整數(實現Integer.valueOf(string)的功能,但是string不符合數字要求時返回0),要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。 思路 注意合法性判別即可 AC程式碼 class

Offer-字串-(3)

知識點/資料結構:字串 題目描述 在一個字串(0<=字串長度<=10000,全部由字母組成)中找到第一個只出現一次的字元,並返回它的位置, 如果沒有則返回 -1(需要區分大小寫). 思路 最直觀的想法是從頭開始掃描這個字串中的每個字元。當訪問到某個字元的時,拿這個字元

offer 字串的排列

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入一

offer| |字串的排列

題目: 輸入一個字串,打印出該字串中字元的所有排列。例如輸入字串abc,則打印出字串a,b,c所能排列出來的所有字元abc,acb,bac, bca, cab和cba. 思路: 1. 可以將字串看成兩部分,一部分是第一個字元,另一部分是剩下的所有字元。

offer------字串------字串轉化為數字

題目 將一個字串轉換成一個整數,要求不能使用字串轉換整數的庫函式。 數值為0或者字串不是一個合法的數值則返回0。 輸入描述: 輸入一個字串,包括數字字母符號,可以為空 輸出描述: 如果是合法的數值表達則返回該數字,否則返回0 示例1 輸入 -21474836

offer-字串的排列

27.字串的排列 題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 解題思路:由於題目要求最後按字典順序列印,我們用TreeSet結構來儲存,最後再用list加

offer--字串的排列

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入一個字串,長度不

[offer]字串的排列

思路: 使用遞迴逐個交換,注意交換完後開始新的交換時需要恢復交換之前的狀態,即回溯 A和A交換,A和B交換,A和C交換,之後再分別進行各自的不同交換,在交換記錄之後回到上一次交換時的狀態。 實現: import java.util.ArrayList; import java.u

Offer-字串-(7)

知識點/資料結構:字串 題目描述 請實現一個函式用來匹配包括’.‘和’‘的正則表示式。模式中的字元’.‘表示任意一個字元,而’'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"abaca"匹配,但是與"a

offer 字串的排列 python

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。 Leetcode有類似的題 樣例 例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 想法一: 使用itertools庫中的permutat

offer——字串的排列(好題,擴充套件題也很好,全排列的演算法)

題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: 輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字

offer----字串的全排列----java實現

字串的全排列 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。  採用遞迴的思想: 把需要全排列的字串分為兩部分看待: (1)字串的

pythonoffer字串的排列

題目:輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。思路:回溯法程式碼: class Solution: def __init__(self):

offer:字串的排列(java)

題目:輸入一個字串,打印出該字串中字元的所有排列。 例如輸入字串abc,則列印由字元a,b,c所能排列出來的所有字串:abc,abc,bac,bca,cab,cba   我們求整個字串的排列,可以看成兩步:首先求出所有可能出現在第一個位置的字元,即把第一個字元和後面

offer--字串替換空格

將一個字串中的空格替換成 "%20"。 Input: "We Are Happy" Output: "We%20Are%20Happy" 這道題第一眼看好簡單啊,直接遍歷然後替換空格就好了啊, 唯一要注意是引數StringBuffer形式 public class Solution

offer-字串全排列(有重複值)

一、問題描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 結果請按字母順序輸出。  輸入描述: 輸入一個字串,長度不超過9(可能有字元重複),字元只包

offer 字串的排列 Python實現

def list_all(string):     new_list_set = []     if len(string) == 1:         return string     for i in range(len(string)):         sub_st

offer-字串

1、常量字串 為了節省記憶體,C++會把常量字串放到單獨一個記憶體區域。當有指標賦值給相同常量字串時,他們會指向相同的記憶體地址。 int main(){ char str1[] = "hello world"; char str2[]

offer——字串的排列

概述 題目描述 輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。 輸入描述: