栈
1.思路:在栈中只要把 / 的下标进栈和出栈就可以计算字符串中的字母,获取字符串中的字母用substring()函数根据 两个 / 的下标来确定区间。之后把符合的字母加入集合中。之后要判断值为“. ."时要删除集合中最后一个元素。之后用for循环拼接简化路径。
class Solution {public String simplifyPath(String path) {//将输入值最后加入一个/,防止输入值最后没有/进行数据截取。path+="/";String s1="";
//接收简要路径的集合ArrayList<String> li=new ArrayList<>();//栈来进行/的进栈操作来判断字符串中的规范字母值Stack<Integer> st=new Stack <>();//先进栈开头的/st.push(0);for(int i=1;i<path.length();i++){//判断字符为‘/‘时要把开头的下标出栈,在将当前的/的下标进行进栈操作if(path.charAt(i)=='/'){int j=st.pop();st.push(i);//判断两个/中是否有字母if(i-j>1){//用substring来进行截取字符串String d=path.substring(j+1,i);//用于判断三个.和三个以上的.的路径String o=path.substring(j+1,j+3);//如果截取的字符串为“..”。要把集合中最后一位的元素删除,如果集合没有元素就跳过if(d.equals("..")){if(li.isEmpty()){continue;}li.removeLast();continue;//如果截取的元素为一个.或者为三个.以上时跳过就好了}else if(d.equals(".")||(o.equals(".")&&i-j>3)){continue;//截取的部分为字母时就添加到集合中}else{li.add(d);} }}}//遍历集合拼接简化的路径for(int i=0;i<li.size();i++){s1+="/"+li.get(i); }//特殊情况,当集合中没有元素要进行特殊的处理。if(li.size()==0){s1="/";}return s1;}
}