力扣刷题日志——字符串和栈

文章目录

      • 有效的括号
      • 反转字符串中的单词
      • 左旋转字符串

有效的括号

力扣刷题日志——字符串和栈_第1张图片

在匹配左括号的时候,右括号先入栈,就只需要比较当前元素和栈顶相不相等就可以了
isEmpty()是空的时候返回 1,否则返回FALSE,deque.peek()是返回栈顶元素

class Solution {
    public boolean isValid(String s) {
        Deque<Character> deque = new LinkedList<>();
        char ch;
        for(int i=0;i<s.length();i++){
            ch=s.charAt(i);
            if(ch=='('){
                deque.push(')');
            }else if(ch == '{'){
                deque.push('}');
            }else if(ch == '['){
                deque.push(']');
            }else if(deque.isEmpty()||deque.peek()!=ch){
                return false;
            }else{
                deque.pop();
            }
        }
        return deque.isEmpty();
    }
}

反转字符串中的单词

力扣刷题日志——字符串和栈_第2张图片

class Solution {
    public String reverseWords(String s) {
        //源字符数组
        char[] initialArr = s.toCharArray();
        //新字符数组
        char[] newArr = new char[initialArr.length+1];//下面循环添加"单词 ",这里加一是为了下面从后往前遍历时的-1;或者是为了存储末尾单词后多的一个空格
        int newArrPos = 0;//新数组的下标
        //i来进行整体对源字符数组从后往前遍历
        int i = initialArr.length-1;
        while(i>=0){
            while(i>=0 && initialArr[i] == ' '){i--;}  //跳过空格,寻找单词的最后位置
            //此时i位置是边界或!=空格,先记录当前索引,之后的while用来确定单词的首字母的位置
            int right = i;
            while(i>=0 && initialArr[i] != ' '){i--;} 
            //指定区间单词取出(由于i为首字母的前一位,所以这里+1,),取出的每组末尾都带有一个空格,用来确定单词的开头位置
            for (int j = i+1; j <= right; j++) {
                newArr[newArrPos++] = initialArr[j];
                if(j == right){
                    newArr[newArrPos++] = ' ';//末尾空格
                }
            }
        }
        //若是原始字符串没有单词,直接返回空字符串;若是有单词,返回0-末尾空格索引前范围的字符数组(转成String返回)
        if(newArrPos == 0){
            return "";
        }else{
            return new String(newArr,0,newArrPos-1);//这里最后减一就解决了最后一个单词后多出一个空格的问题
        }
    }
}

左旋转字符串

力扣刷题日志——字符串和栈_第3张图片

JAVA中的reverse方法只能反转一整个字符串,不支持区间内的反转,所以要手写一个方法体,这里我们采取先部分反转然后再整体反转来达到最终结果,
//setCharAt()该方法是StringBuffer中的方法,主要作用是将字符串中指定的位置的字符替换成目标字符,
// setCharAt(int index,char ch)index就是取代的位置 索引从0开始,ch是你要替换为的字符串。

class Solution {
    public String reverseLeftWords(String s, int n) {
        int len=s.length();
        StringBuilder sb=new StringBuilder(s);
        reverseString(sb,0,n-1);//先反转前n个
        reverseString(sb,n,len-1);//然后反转n之后的剩下的字母
        return sb.reverse().toString();//整体反转后转换为字符串的形式。
    }
     public void reverseString(StringBuilder sb, int start, int end) {
        while (start < end) {
            char temp = sb.charAt(start);
            sb.setCharAt(start, sb.charAt(end));//setCharAt()该方法是StringBuffer中的方法,主要作用是将字符串中指定的位置的字符替换成目标字符,   
				// setCharAt(int index,char ch)index就是取代的位置 索引从0开始,ch是你要替换为的字符串。
            sb.setCharAt(end, temp);
            start++;
            end--;
            }
        }
}

你可能感兴趣的:(leetcode,算法,职场和发展)