问题描述:?代表一个字符;*代表0到多个字符。
问题思路:(回溯)
1.在逐步访问s、p串的过程中,遇到“*”时,记录此时s、p串的索引; 2.令“*”匹配s串的i(i = 0, 1, 2, 3...)个字符,判断两个字符串是否匹配; 3.如果不匹配则回溯至1中记录的两个索引,重复2; 4.直至s串的最后一个字符,判断是否完全匹配。
代码实现:
public class Wildcard { public static void main(String[] args) { // TODO Auto-generated method stub String s = "text.xmla"; String p = "te**t.*la*"; System.out.println(match(s, p)); } public static boolean match(String s, String p) { //i和j分别为两个数组的指针 //字符相同或为?,则指针后移 //如果p[j]='*',去重,记录*的位置,便于回溯,依次使*匹配 0、1、2、n个字符, //即匹配i个不成功时,j回溯到*的位置,匹配i+1个 char[] sc = s.toCharArray(); char[] pc = p.toCharArray(); //两个指针 int i=0 ,j =0; int slen = sc.length; int plen = pc.length; //上一个*的位置 int last_star_p = 0; int last_star_s = 0; while(i < slen) { if(j < plen && (sc[i] == pc[j] || pc[j] == '?')) { //字符相同或为? i++; j++; }else if(j < plen && pc[j] == '*') { //字符为*,去重,记录回溯点last_star_p,依次匹配0-n个字符 while(j < plen && pc[j] == '*') { last_star_p = j; j++; } last_star_s = i; }else if(last_star_p < plen) { //上边没有匹配上,则j回溯上一个*的位置last_star_p,使其匹配i+1个字符 j = last_star_p + 1; last_star_s++; i = last_star_s; } else { return false; } } //p字符串尾部存在多个*号 while(j < plen && pc[j] == '*') { j++; } return j == plen; } }
输出:true
这是水木竹水的博客
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/16201.html