天天看點

華為OJ平台——字元串通配符

題目描述:

在計算機中,通配符一種特殊文法,廣泛應用于檔案搜尋、資料庫、正規表達式等領域。現要求各位實作字元串通配符的算法。

要求:

實作如下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