这个是参加上海某家数据咨询公司的Java笔试题,胡乱的写写,大神勿喷,菜鸟一枚。
题目:给你两个字符串,每个字符串的组成都是a-z,'*','.'这些符号,而*的功能是将其前面的字符删除,'.'可以替代任何一个字符,写一个算法判断两个字符串是否相等。
例子:
isMatch("a*","")=true;
isMatch("a.","ab")=true;
isMatch(".","")=false;
isMatch("a*.cba*c.","xcbcm") = true;
public class TestDemo {
public static void main(String[] args) {
/**
* isMatch("a*","")=true;
* isMatch("a.","ab")=true;
* isMatch(".","")=false;
* isMatch("a*.cba*c.","xcbcm") = true;
*/
TestDemo testDemo = new TestDemo();
System.out.println(testDemo.isMatch("a*", ""));
System.out.println(testDemo.isMatch("a.", "ab"));
System.out.println(testDemo.isMatch(".", ""));
System.out.println(testDemo.isMatch("a*.cba*c.","xcbcm"));
}
public boolean isMatch(String src,String des){
//处理*
String srcTmp = this.resolveX(src);
String desTmp = this.resolveX(des);
//System.out.println(srcTmp + " " + desTmp);
//处理.
//1:当存在一个字符串为空时直接返回false
if((srcTmp.length() == 0 &&desTmp.length()>0) || (srcTmp.length() > 0 &&desTmp.length() == 0)){
return false;
}else{
//2.1:双方都为空
if(srcTmp.length() == 0 && desTmp.length() == 0){
return true;
}else{
//2.2:双方都不为空,则开始处理.
return this.resolveD(srcTmp, desTmp);
}
}
}
/**
* 消除字符串中的*
* @param src 需要处理的字符串
* @return 返回处理后的字符串,可能为空
*/
public String resolveX(String src){
int i=0;
int len = src.length();
int j=0;
char[] tmpArr = src.toCharArray();
while(i<src.length()){
char tmp = src.charAt(i);
if(tmp != '*'){
tmpArr[i-j] = tmpArr[i];
}else{
j = j + 2;
len = len - 2;
if((i+2) > src.length()){
break;
}
}
i++;
}
return new String(tmpArr,0,len);
}
/**
* 处理字符串中的.
* @param src 第一个字符串
* @param des 第二个字符串
* @return 返回处理后的字符串数组
*/
public boolean resolveD(String src,String des){
int i = 0;
char[] srcTmp = src.toCharArray();
char[] desTmp = des.toCharArray();
//如果两个字符串长度不同,返回false
if(src.length() != des.length()){
return false;
}
while(i<srcTmp.length){
//如果字符串相同,逐字符比较
if(srcTmp[i] == desTmp[i]){
i++;
}else{
if(srcTmp[i] == '.' || desTmp[i] == '.'){
i++;
}else{
return false;
}
}
}
return true;
}
}