Day 29
题目描述

思路
根据题目要求,字符串如果是合法,需要满足三个条件,这里最重要的是第二个条件,括号必须按照正确顺序闭合,也就是({)}这种情况是不合法的,因此有以下做法:
- 创建一个栈用来存放左括号left
- 从前向后遍历字符串
- 如果为左括号,就加入到栈中
- 如果为右括号,判断栈中是否有元素(无元素返回false),有元素就取出顶部元素,如果不匹配(返回false),匹配就继续遍历字符串
- 遍历结束后,如果左括号栈不为空,也返回false
- 最后如果左括号为空,返回true。
java
class Solution {
public boolean isValid(String s) {
Stack<Character> left = new Stack<>();
char c;
for (int i = 0; i < s.length(); i++) {
c = s.charAt(i);
if (c == '(' || c == '{' || c == '[') {
left.push(c);
}
else if (c == ')'){
if (!left.isEmpty()&&left.peek() == '(') {
left.pop();
}
else{
return false;
}
}
else if (c == '}'){
if (!left.isEmpty()&&left.peek() == '{') {
left.pop();
}
else{
return false;
}
}
else{
if (!left.isEmpty()&&left.peek() == '[') {
left.pop();
}
else{
return false;
}
}
}
if(left.isEmpty()){
return true;
}
else return false;
}
}
题目描述

思路
难点 :此题难点在于如何处理返回上一级文件夹,而且可能出现/d/c/./b/。。/。。/a这种情况,需要连续返回两个文件夹.(结果应该返回/d/a)
初次思路 :首先对于这个给出的字符串,有用的信息即为文件名(包括。,。。,。。。),我的想法是创建一个栈,依次取出文件名加入到栈中,依次弹出栈后单独处理/即可
做法:
- 创建一个栈来存放文件名,创建一个res来存放结果
- 从头开始遍历字符串,依次取出文件名(这段建议看看代码)
- 遍历栈,取出栈顶文件名,弹出栈顶。
- 如果栈顶文件名为。。(最麻烦的一种情况),创建一个计数器初始为1,记录之后弹出的元素中有几个。。,
- 取出栈顶元素,如果为。。,计数器加1,弹出栈,重复以上操作,直到栈顶元素不为。。
- 此时我们有计数器,循环弹出,直到计数器为0,我们还得接着弹出栈,弹出栈可能存在三种情况,如果为弹出的栈顶元素为 。,什么都不做,因为根据题意。是要被省略的;如果弹出栈顶元素 为。。,计数器加1;如果弹出元素为其他,计数器-1
- (续4)如果栈顶为。,直接弹出栈顶元素,不处理
- 如果栈顶为其他,说明这个是我们要找的文件名, res='/'+filrname+res保存结果(这样可以满足起始为/,结尾不为/)
- 遍历结束时,如果res为空,则加一个/(可能/。的情况)
10.返回res
java
class Solution {
public String simplifyPath(String path) {
Stack<String> file = new Stack<>();
String filrname="";
String res="";
int x=0;
for (int i = 0; i < path.length(); i++) {//取出文件名
if (path.charAt(i) != '/') {
filrname=filrname+path.charAt(i);
}
else {
if(!filrname.equals("")){//防止存入空值
file.add(filrname);
filrname="";
}
}
}
if(!filrname.equals("")){//因为最后一个文件名后可能不存在/,单独处理一下
file.add(filrname);
}//将所有的文件名加入到了栈中
if(file.isEmpty()){
res="/";
return res;
}
while (!file.isEmpty()) {//遍历栈
filrname=file.peek();
file.pop();
if(filrname.equals("..")){//说明要跳过栈中的下一个元素
int sum=1;//还要跳过的元素
while(!file.isEmpty()){
if(file.peek().equals("..")){//弹出。。,记录还要跳过的元素的个数
sum++;
file.pop();
}
else{//不为。。就终止
break;
}
}
while (sum!=0){
if(!file.isEmpty()){//防止报错
if(file.peek().equals(".")){//省略
file.pop();
}
else if(file.peek().equals("..")){//还得弹出,计数器加一
file.pop();
sum++;
}
else{//计数器-1
file.pop();
sum--;
}
}
else{
break;
}
}
}
else if(filrname.equals(".")){
//不处理
}
else{//加入到结果字符串
res='/'+filrname+res;
}
}
if(res.equals("")){//防止/。
res="/";
}
return res;
}
}