題目描述:
在計算機中,通配符一種特殊文法,廣泛應用于檔案搜尋、資料庫、正規表達式等領域。現要求各位實作字元串通配符的算法。
要求:
實作如下2個通配符:
*:比對0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同)(不包含. , 等特殊字元)
?:比對1個字元
輸入
通配符表達式;
一組字元串。
輸出
傳回比對的結果,正确輸出true,錯誤輸出false
思路:
分三種情況:
(1)無通配符的情況:對應的字元要完全相等,否則比對失敗,輸出false
(2)通配符為?的情況:對應的一個字元是字母(不區分大小寫)或數字,否則比對失敗,輸出false
(3)通配符為*的情況:比對字元串中下一個非字母和數字的字元必須與*後的字元相同,否則比對失敗,輸出false
如果最後經過循環後沒有false輸出,則表明比對成功,輸出true
1 import java.util.Scanner;
2
3 /**
4 * 在計算機中,通配符一種特殊文法,廣泛應用于檔案搜尋、資料庫、正規表達式等領域。
5 * 現要求各位實作字元串通配符的算法。
6 * 要求:
7 * 實作如下2個通配符:
8 * *:比對0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同)
9 * ?:比對1個字元
10 *
11 * 輸入
12 * 通配符表達式;
13 * 一組字元串。
14 * 輸出
15 * 傳回比對的結果,正确輸出true,錯誤輸出false
16 *
17 */
18 public class StringMatch {
19
20 public static void main(String[] args) {
21 //輸入,讀入兩行字元
22 Scanner cin = new Scanner(System.in) ;
23 String str = cin.nextLine() ;
24 String strMatch = cin.nextLine() ;
25 cin.close();
26
27 int len = str.length() ;
28 int lenMatch = strMatch.length() ;
29 int i = 0 ;
30 int j = 0 ;
31
32 char temp ;
33 //循環比較,判斷條件是當任一個到達字元串尾時結束循環
34 while(i < len && j < lenMatch ){
35 /*
36 * 分三種情況:
37 * (1)無通配符的情況:對應的字元要完全相等,否則比對失敗,輸出false
38 * (2)通配符為?的情況:對應的一個字元是字母(不區分大小寫)或數字,
39 * 否則比對失敗,輸出false
40 * (3)通配符為*的情況:比對字元串中下一個非字母和數字的字元必須與*後的字元相同,
41 * 否則比對失敗,輸出false
42 * 如果最後經過循環後沒有false輸出,則表明比對成功,輸出true
43 */
44 if(str.charAt(i) != '*' && str.charAt(i) != '?' ){
45 //(1)無通配符的情況
46 if(str.charAt(i) != strMatch.charAt(j)){
47 //比對失敗,輸出false
48 System.out.println("false");
49 return ;
50 }else{
51 //比對成功,進入各自下一個字元的比對
52 i++ ;
53 j++ ;
54 continue ;
55 }
56 }else if(str.charAt(i) == '?'){
57 //(2)通配符為?的情況
58 temp = strMatch.charAt(j) ;
59 if( (temp >= 'a' && temp <= 'z')
60 || (temp >= 'A' && temp <= 'Z')
61 || (temp >= '0' && temp <= '9')){
62 //比對成功,進入各自下一個字元的比對
63 i++ ;
64 j++ ;
65 continue ;
66 }else{
67 //比對失敗,輸出false
68 System.out.println("false");
69 return ;
70 }
71 }else{
72 //(3)通配符為*的情況
73 temp = strMatch.charAt(j) ;
74 if( (temp >= 'a' && temp <= 'z')
75 || (temp >= 'A' && temp <= 'Z')
76 || (temp >= '0' && temp <= '9')){
77 //strMatch的目前字元比對成功,進入strMatch的下一個字元的比對
78 j++ ;
79 continue ;
80 }else{
81 //比對字元串中下一個非字母和數字的字元必須與*後的字元相同,
82 //表明StrMatch的目前字元為非數字、字母的字元,必須比對str中*後一個字元
83 if(i == (len-1)){
84 //如果str中*是最後一個,則比對失敗,輸出false
85 System.out.println("false");
86 return ;
87 }else{
88 //如果str中*不是最後一個,則繼續str中的下一個,繼續比對
89 i++ ;
90 continue ;
91 }
92 }
93 }
94 }
95
96 System.out.println("true");
97 return ;
98 }
99
100 }
View Code
轉載于:https://www.cnblogs.com/mukekeheart/p/5596807.html