题目:
给定一个只包括 '(',')','{','}','[',']' 的字符串,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
解法1:
思路: 使用hashmap进行存括号的匹配关系,再使用栈来存储左括号;每次进行比较然后弹栈;
步骤:
- 将括号匹配关系放入hashmap中
- 遍历数组,如果该字符串在map中没有,则表明该字符串是左括号或者其他字符串,放入栈中
- 如果该字符串map中有,则表示遍历的是右括号,则要去弹出栈中的元素,看是否匹配,如果不匹配,则表示字符串无效,返回false
步骤
/**
* 描述: 判断字符串是否有效
*
* @author pengjie_yao
* @date 2019/7/17 16:54
*/
public class ValidString {
public static void main(String[] args) {
// Boolean validString = isValidString("{}[]{]}");
// System.out.println(validString);
Boolean validString = isValidString1("{}[]{}");
System.out.println(validString);
}
/**
* 法一 使用堆栈
* @param string
* @return
*/
public static Boolean isValidString(String string){
HashMap<Character,Character> hashMap = new HashMap<>();
Stack stack = new Stack();
hashMap.put(')', '(');
hashMap.put(']', '[');
hashMap.put('}', '{');
for (int i = 0; i < string.length(); i++) {
Character result = string.charAt(i);
if (! hashMap.containsKey(result)) {
stack.push(result);
} else if (stack.isEmpty() || hashMap.get(result) != stack.pop()) {
return false;
}
}
// 栈为空才返回
return stack.isEmpty();
}
}
解法2
思路: 直接替换,即用字符串的直接替换,只要发现字符串中有该匹配的字符串,则替换掉;
/**
* 直接替换法,则只要发现有匹配,直接将字符串中对应的括号直接替换掉,最终根据字符串的长度返回结果
* @param string
* @return
*/
public static Boolean isValidString1(String string) {
int length;
do {
length = string.length();
string = string.replace("()", "").replace("[]", "").replace("{}", "");
} while (length != string.length());
return string.length() == 0;
}
leetcode中写的比较好的代码学习
思路:同样也是使用栈,用数组作为栈,然后index作为栈顶元素
遍历数组,如果都为左括号,则都加入栈中,同时栈顶元素移动
如果遍历的不是左括号,则判断是否是右括号,是的话,先判断栈中是否有左括号存在,没有直接返回false,有的话,在判断是否等于栈中的元素,因为括号全部就3个,所以只要判断是否等于这三个括号即可,有则返回true,没有则返回false
public boolean isValid(String s) {
int index = -1;
char[] arr = s.toCharArray();
char[] stack = new char[arr.length];
for (int i = 0; i < arr.length; i++) {
if (arr[i] == '(' || arr[i] == '[' || arr[i] == '{') {
index++;
stack[index] = arr[i];
}
if (arr[i] == ')' || arr[i] == '}' || arr[i] == ']') {
if (index < 0) {
return false;
}
else if ((stack[index] == arr[i] - 1) || (stack[index] == arr[i] - 2) ) {
index--;
}
else {
return false;
}
}
}
if (index < 0) {
return true;
}
else {
return false;
}
}