華為OJ——字串萬用字元
阿新 • • 發佈:2019-01-24
題目描述
問題描述:在計算機中,萬用字元一種特殊語法,廣泛應用於檔案搜尋、資料庫、正則表示式等領域。現要求各位實現字串萬用字元的演算法。
要求:
實現如下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;
}
}
}
}