1日1回の筆記テスト–leetCode:20。有効な括弧(単純)
## leetCode:20。有効な括弧(単純)
のみ与えられ含み'('
、')'
、'{'
、'}'
、'['
、']'
、文字列を文字列が有効であるか否かを判断します。
有効な文字列は次の条件を満たす必要があります。
- 左括弧は、同じタイプの右括弧で閉じる必要があります。
- 左括弧は正しい順序で閉じる必要があります。
空の文字列は有効な文字列と見なすことができることに注意してください。
例1:
输入: "()"
输出: true
例2:
输入: "()[]{}"
输出: true
例3:
输入: "(]"
输出: false
例4:
输入: "([)]"
输出: false
例5:
输入: "{[]}"
输出: true
ソリューション1:スタック
括弧の有効性の判断は、データ構造「スタック」を使用して解決できます。
与えられた文字列sをトラバースし、左括弧が見つかった場合、後続のトラバーサルでは、同じタイプの右括弧がそれを閉じると予想します。後で検出される左括弧は最初に閉じる必要があるため、この左括弧をスタックの一番上に配置できます。
閉じ括弧が見つかった場合、同じタイプの開き括弧を閉じる必要があります。この時点で、スタックの一番上にある左括弧を取り出して、それらが同じタイプの括弧であるかどうかを判別できます。同じ型でない場合、またはスタックに左括弧がない場合、文字列sは無効であり、Falseが返されます。括弧のタイプをすばやく判別するために、HashMapを使用して、括弧の各タイプを保管できます。ハッシュマップのキーは右括弧であり、値は同じタイプの左括弧です。
走査が終了した後、スタックに左括弧がない場合は、文字列sのすべての左括弧を閉じてTrueを返し、それ以外の場合はFalseを返します。
有効な文字列の長さは偶数でなければならないため、文字列の長さが奇数の場合は、Falseを直接返し、後続の走査判定プロセスを保存できます。
public boolean isValid(String s) {
//获取字符串的长度
int n = s.length();
//如果字符串长度为奇数,则不可能有效,直接返回false
if (n % 2==1) {
return false;
}
//用哈希映射(HashMap)存储每一种括号。
HashMap<Character, Character> pairs = new HashMap(){
{
put(')','(');
put(']','[');
put('}','{');
}
};
//创建一个队列
Deque<Character> stack=new LinkedList<>();
for (int i = 0; i <n ; i++) {
char c = s.charAt(i);
if (pairs.containsKey(c)) {
if (stack.isEmpty() || stack.peek() != pairs.get(c)) {
return false;
}
stack.pop();
}else {
stack.push(c);
}
}
return stack.isEmpty();
}
解決策2:
public boolean isValid(String s) {
LinkedList<Character> stack = new LinkedList<>();
for (char c : s.toCharArray()) {
if (c == '[') stack.push(']');
else if (c == '(') stack.push(')');
else if (c == '{') stack.push('}');
else if (stack.isEmpty() || c != stack.pop()) return false;
}
return stack.isEmpty();
}