劍指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)字串的 python劍指offer字串的排列題目:輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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。 輸入描述: |