IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 力扣day04 -> 正文阅读

[数据结构与算法]力扣day04

今天偷个懒

20、有效的括号

很简单,用个栈即可
正常一般都这样想

  public boolean isValid(String s) {
        char[] chars = s.toCharArray();
        Deque<Object> stack = new ArrayDeque<>();
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] == '(' || chars[i] == '[' || chars[i] == '{') {
                stack.push(chars[i]);
            } else {
                switch (chars[i]){
                    case ')':chars[i]='(';break;
                    case ']':chars[i]='[';break;
                    case '}':chars[i]='{';break;
                    default:break;
                }
                if (!stack.isEmpty()&&chars[i]==(char)stack.peek()) {
                    stack.pop();
                } else {
                    return false;
                }
            }
        }
        if (stack.isEmpty())return true;
        else return false;
    }

在这里插入图片描述
题解大佬巧妙的解法:只存右括号,因为如果匹配那么下一个字符肯定等于栈顶。

class Solution {
    public boolean isValid(String s) {
     if(s.isEmpty())
            return true;
        Stack<Character> stack = new Stack<Character>();
        //利用栈先进后出 stack 局部变量
        //当stack 压栈不成功后 后进去的括号自动弹出来 循环一次弹出一次
        //c!=stack.pop() 取反 相等就自动弹栈 一直弹到没有说明对上了
        for(char c:s.toCharArray()){
            if(c=='(')
                stack.push(')');
            else if(c=='{')
                stack.push('}');
            else if(c=='[')
                stack.push(']');
            else if(stack.empty()||c!=stack.pop())
                return false;
        }
        //循环完了 如果是空说明正确了 否则false
        if(stack.empty())
            return true;
        return false;
    }
}

在这里插入图片描述

21.合并两个有序链表

很简单,直接上代码

 public ListNode mergeTwoLists(ListNode l1, ListNode l2) {
        ListNode l3 = new ListNode();
        ListNode cur = l3;

        while (l1 != null && l2 != null) {
            if (l1.val < l2.val) {
                cur.next = l1;
                l1 = l1.next;
            } else {
                cur.next = l2;
                l2 = l2.next;
            }
            cur = cur.next;
        }
        if (l1 == null) {
            cur.next = l2;
        } else {
            cur.next = l1;
        }
        return l3.next;   
    }

在这里插入图片描述

26. 删除有序数组中的重复项

快慢指针问题

    public int removeDuplicates(int[] nums) {
       int low=0,fast=1;
       while (fast< nums.length){
           //如果重复接着往下找
           if(nums[low]==nums[fast]){
               fast++;
           }else {
               //不重复则把后面的放在前面
               nums[++low]=nums[fast++];
           }
       }
       return low+1;
    }

在这里插入图片描述

27.移除元素

类似26,设置双指针

    public int removeElement(int[] nums, int val) {
        int high = nums.length - 1;
        for (int low = 0; low <= high; low++) {
            if (nums[low] == val) {
                //题目给出不用在乎排序
                swap(nums, low--, high--);
            }
        }
        return high + 1;
    }
    private void swap(int[] nums, int low, int high) {
        int tmp = nums[low];
        nums[low] = nums[high];
        nums[high] = tmp;
    }

在这里插入图片描述

28. 实现 strStr()

先根据题目去掉特殊情况,然后正常判断

 public int strStr(String haystack, String needle) {
       if ("".equals(needle)) {
            return 0;
        }
        if (!haystack.contains(needle)) {
            return -1;
        }
        if (haystack.length() == 1) {
            return 0;
        }
        for (int i = 0; i < haystack.length(); i++) {
            if (haystack.charAt(i) == needle.charAt(0)) {
                int n=0;
                while (n<needle.length()){
                    if(haystack.charAt(i+n)==needle.charAt(n)){
                        n++;
                    }else {
                        break;
                    }
                }
                if (n==needle.length()){
                    return i;
                }
            }
        }
        return 0;
    }

在这里插入图片描述
这这里我也没想到能这么快,复杂度是O(m*n)
题解是KMP算法
算法讲解视频:KMP算法

 // KMP 算法
    // ss: 原串(string)  pp: 匹配串(pattern)
    public int strStr(String ss, String pp) {
        if (pp.isEmpty()) return 0;
        
        // 分别读取原串和匹配串的长度
        int n = ss.length(), m = pp.length();
        // 原串和匹配串前面都加空格,使其下标从 1 开始
        ss = " " + ss;
        pp = " " + pp;

        char[] s = ss.toCharArray();
        char[] p = pp.toCharArray();

        // 构建 next 数组,数组长度为匹配串的长度(next 数组是和匹配串相关的)
        int[] next = new int[m + 1];
        // 构造过程 i = 2,j = 0 开始,i 小于等于匹配串长度 【构造 i 从 2 开始】
        for (int i = 2, j = 0; i <= m; i++) {
            // 匹配不成功的话,j = next(j)
            while (j > 0 && p[i] != p[j + 1]) j = next[j];
            // 匹配成功的话,先让 j++
            if (p[i] == p[j + 1]) j++;
            // 更新 next[i],结束本次循环,i++
            next[i] = j;
        }

        // 匹配过程,i = 1,j = 0 开始,i 小于等于原串长度 【匹配 i 从 1 开始】
        for (int i = 1, j = 0; i <= n; i++) {
            // 匹配不成功 j = next(j)
            while (j > 0 && s[i] != p[j + 1]) j = next[j];
            // 匹配成功的话,先让 j++,结束本次循环后 i++
            if (s[i] == p[j + 1]) j++;
            // 整一段匹配成功,直接返回下标
            if (j == m) return i - m;
        }

        return -1;
    }
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-07-05 20:27:23  更:2021-07-05 20:27:55 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 16:30:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码