1. 程式人生 > >華為OJ——字串萬用字元

華為OJ——字串萬用字元

題目描述

  問題描述:在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正則表示式等領域。現要求各位實現字串萬用字元的演算法。

  • 要求:
    實現如下2個萬用字元:
    *:匹配0個或以上的字元(字元由英文字母和數字0-9組成,不區分大小寫。下同)
    ?:匹配1個字元

  • 輸入:
    萬用字元表示式;
    一組字串。

  • 輸出:
    返回匹配的結果,正確輸出true,錯誤輸出false

  • 輸入描述:
    先輸入一個帶有萬用字元的字串,再輸入一個需要匹配的字串

  • 輸出描述:
    返回匹配的結果,正確輸出true,錯誤輸出false

  • 示例1
    輸入
      te?t*.*
      txt12.xls
    輸出


      false

實現程式碼

  • 思路:
    根據情況,討論具體見程式碼註釋
package cn.c_shuang.test8;

import java.util.Scanner;

/**
 * 字串萬用字元
 * @author Cshuang
 *
 */
public class Main {

    public static void main(String[] args) {
         Scanner in = new Scanner(System.in);
         while (in.hasNext()) { 
           String s1 = in.next();
           String s2 = in.next();
           System.out.println(compare(s1,s2));
         }
         in.close();
    }

    public
static boolean compare(String s1,String s2) { int i = 0, j = 0, k = 0;//i代表s1的索引位置,j代表s2的索引位置,k代表碰到*後,i的後一個位置 boolean skipStar=false;//檢索到*後,skipStar來判斷是否匹配到*的後一個位置的字元,若匹配到,則跳過該*,同時i+1; while (i < s1.length() && j < s2.length()) { if (s1.charAt(i) == s2.charAt(j)) { i++; j++; continue
; } else if (s1.charAt(i) == '?') { i++; j++; continue; } else if (s1.charAt(i) == '*'){ skipStar=false; if (s1.length() == s2.length()) {//若s1和s2的長度一致,說明*號只匹配一個字元 i++; j++; continue; } else if(s1.length()==i+1) {//*為s1的末尾字元,則不用檢索s2後面的,直接返回true,因為*可以匹配s2後面的所有字元 return true; } else{//說明*後面還有字元,所以要判斷*後面的字元是否能匹配到相應的字元 if(!skipStar){ k=i+1;//將*後面的緊跟著一個字元的位置,賦值給k if(s1.charAt(k)==s2.charAt(j)){//若檢索到s2中與k相匹配的字元,則跳過*,即將i的位置自增 i++; skipStar=true; } else if(j==s2.length()-1)//若s2檢索到最後還未匹配到與k位置相匹配的字元,則返回false return false; } j++;//每檢索一次s2,j自增 continue; } } else return false; } //s1檢索完了,但是s2還未檢索完,則必定為false(對於s1最後為*,同時s2還未檢索完的情況,不會執行到這,上面已經做了處理,直接返回了true) if (j < s2.length()) return false; else{//s2檢索完,需討論s1的情況 if(s1.length()==s2.length()){//s1也檢索完 return true; }else{//s1還未檢索完 if(s1.charAt(j)=='*'&&s1.length()==j+1)//若s2檢索完了,同時s1後面只為* return true; else //說明s1後面不滿足只為*的情況 return false; } } } }