- 边写边学Markdown
- 实现一下头条面试官的要写的字符串匹配问题
问题描述
给定一个字符串判断是不是xml格式,例如“<name>temp</name>"
,然后题目简化了要求,假设输入只有<>
、</>
两种标签以及其他字符串,其中标签中没有内容也是合法的,比如<>我是一个合法标签</>
思路
听到题就想到不就是字符串匹配吗,比以前本科一年级上C++时候写的加减乘除括号的算式表达式匹配还简单,就是一个栈存放左标签然后遇到一个右标签就去比较,遍历完栈空就合法。不过当时作为我第一次面试有点紧张,然后确实代码敲少了,当时就没AC,哭泣…
代码
public static boolean isXml(String xml) {
Stack<String> stack = new Stack<>();
for(int i=0; i<xml.length(); ++i) {
/*如果栈为空,那么接下来必须要在当前位置匹配左标签*/
if(stack.empty()) {
if(xml.charAt(i) != '<')
return false;
int p = xml.indexOf('>', i+1);
/*未匹配到>,或者匹配到右标签</>*/
if(p == -1 || xml.charAt(i+1) == '/')
return false;
/*将标签内容加入栈*/
stack.push(xml.substring(i+1,p));
i = p;
continue;
}
/*找下一个标签,不管中间内容*/
int l = xml.indexOf('<', i);
if(l == -1)
return false;
int r = xml.indexOf('>', l+1);
if(r == -1)
return false;
/*匹配到右标签*/
if(xml.charAt(l+1) == '/') {
if(xml.substring(l+2, r).equals(stack.peek())) {
stack.pop();
i = r;
continue;
}
else return false;
}
/*左标签,加入栈*/
else {
stack.push(xml.substring(l+1, r));
i = r;
}
}
if(stack.empty())
return true;
return false;
}