王清欢Randy 王清欢Randy
首页
  • 编程语言

    • C/C++ 学习笔记
    • Golang 学习笔记
  • 算法分析

    • LeetCode 刷题笔记
  • 操作系统

    • Linux 基础
    • Vim 实用技巧
    • Shell 脚本编程
    • GDB 学习笔记
  • 开发工具

    • Git 学习笔记
  • 分布式理论

    • 共识算法
    • 分布式事务
  • 数据库内核

    • PostgreSQL
    • Postgres-XL
  • hidb
  • pgproxy
  • 实用技巧
  • 学习方法
  • 资源分享
GitHub (opens new window)
首页
  • 编程语言

    • C/C++ 学习笔记
    • Golang 学习笔记
  • 算法分析

    • LeetCode 刷题笔记
  • 操作系统

    • Linux 基础
    • Vim 实用技巧
    • Shell 脚本编程
    • GDB 学习笔记
  • 开发工具

    • Git 学习笔记
  • 分布式理论

    • 共识算法
    • 分布式事务
  • 数据库内核

    • PostgreSQL
    • Postgres-XL
  • hidb
  • pgproxy
  • 实用技巧
  • 学习方法
  • 资源分享
GitHub (opens new window)
  • 基础算法

    • 双指针

      • 双指针基础
      • 碰撞指针
      • 快慢指针
      • 滑动窗口
    • 二分查找

      • 基础应用
      • 边界收缩
      • 局部有序
    • 排序算法

      • 01八大排序
      • 02快速排序
      • 03归并排序
      • 04桶排序
      • 05堆排序
    • 优先搜索

      • 01递归
      • 02网格结构深度优先搜索
      • 03树结构深度优先搜索
      • 04图结构深度优先搜索
      • 05网格结构广度优先搜索
      • 06树结构广度优先搜索
      • 07图结构广度优先搜索
    • 回溯算法

      • 01递归
      • 02 子集问题
      • 03 全排列问题
      • 04 组合问题
      • 05 回溯搜索问题
  • 基础数据结构

    • 线性表与哈希表

      • 01数组
      • 02栈和队列
      • 03单调栈
      • 04优先队列
      • 05双端队列
      • 06哈希表
      • 07多重集合
      • 08前缀和
      • 09数据结构设计
    • 字符串

      • 01字符串比较
        • 02回文字符串
        • 03字符串匹配
        • 04字符串算术表达式
      • 单链表

        • 01链表基础操作
        • 02链表遍历
      • 二叉树

        • 01二叉树的属性
        • 02二叉树的操作
        • 03层次遍历
        • 04前中后序遍历
        • 05二叉搜索树的属性
        • 06二叉搜索树的操作
        • 07字典树
        • 08二叉搜索树BST
      • 图

        • 01二分图
        • 02拓扑排序
        • 03并查集
        • 04最小生成树
        • 05最短路径
    • 进阶算法

      • 贪心算法

        • 01跳跃游戏
        • 02分配问题
        • 03区间问题
      • 分治策略

      • 动态规划

        • 01一维动态规划
        • 02二维动态规划
        • 03分割型动态规划
        • 04子序列问题
        • 05背包问题
        • 06字符串编辑问题
        • 07股票交易问题
    • 其他内容

      • 数学问题

        • 01公倍数与公因数
        • 02质数问题
        • 03进制转换问题
        • 04数字字符串求和问题
        • 05众数问题
        • 06中位数问题
        • 07数字处理问题
        • 08随机数问题
      • 位运算

        • 01位运算基础
        • 02妙用异或运算
        • 03二进制特性
    • LeetCode刷题笔记
    • 基础数据结构
    • 字符串
    王清欢
    2023-03-24
    目录

    01字符串比较

    # 01 字符串比较

    # 242 有效的字母异位词 (opens new window)

    判断两个字符串包含的字符是否完全相同。

    输入两个字符串,输出一个布尔值,表示两个字符串是否满足条件。

    输入: s = "anagram", t = "nagaram"
    输出: true
    

    解析:

    ​ 可以利用哈希表或者数组统计两个数组中每个数字出现的频次,若频次相同,则说明它们包含的字符完全相同。

    ​ 为了降低空间复杂度,我们可以仅采用一个哈希表或数组记录 S 中字符的频次,然后减去 T 中对应字符出现的频次,如果最终该频次为 0 则该字符在 S 和 T 中个数相等,如果最终S和T所有字符频次都想等那么他们是异位词。这种方式避免了单独再开辟一个空间取存储 T 中字符的频次。

    class Solution {
    public:
        bool isAnagram(string s, string t) {
            if(s.length()!=t.length()) return false;
            unordered_map<char,int> s_cnt;
            for(int i=0;i<s.length();++i){
                ++s_cnt[s[i]];
                --s_cnt[t[i]];
            }
    
            for(const auto [h_key,h_val]: s_cnt){
                if(h_val){
                    return false;
                }
            }
            return true;
        }
    };
    

    # 205 同构字符串 (opens new window)

    判断两个字符串是否同构。同构的定义是,可以通过把一个字符串的某些相同的字符转换成另一些相同的字符,使得两个字符串相同,且两种不同的字符不能够被转换成同一种字符。

    输入两个字符串,输出一个布尔值,表示两个字符串是否满足条件。

    输入:s = "egg", t = "add"
    输出:true
    输入:s = "foo", t = "bar"
    输出:false
    

    解析:

    ​ 本题可以通过哈希表记录两个字符串每种字符第一次出现的位置,如果两个字符串中相同位置的字符与它们第一次出现的位置一样,那么这两个字符串同构。如果他们第一次出现的位置一样,那么说明当前两个字符的对应关系是正确的;如果不一样,说明当前两个字符的对应关系是错误的,不满足异构。

    class Solution {
    public:
        bool isIsomorphic(string s, string t) {
            if(s.length()!=t.length()) return false;
            unordered_map<char,int> s_first_in;
            unordered_map<char,int> t_first_in;
            for(int i=1;i<s.length();++i){
                if(s_first_in.find(s[i]) == s_first_in.end()){
                    s_first_in[s[i]] = i;
                }
                if(t_first_in.find(t[i]) == t_first_in.end()){
                    t_first_in[t[i]] = i;
                }
            }
            for(int i=0;i<s.length();++i){
                if(s_first_in[s[i]] != t_first_in[t[i]]){
                    return false;
                }
            }
            return true;
        }
    };
    

    # 696 计数二进制子串 (opens new window)

    给定一个 0-1 字符串,求有多少非空子字符串的 0 和 1 数量相同。

    输入是一个字符串,输出一个整数,表示满足条件的子字符串的数量。

    输入: "00110011" 输出: 6 解释: 有6个子串具有相同数量的连续1和0:“0011”,“01”,“1100”,“10”,“0011” 和 “01”。

    解析:

    ​ 从左往右遍历数组,记录和当前位置数字相同且连续的长度,以及其之前连续的不同数字的长度。举例来说,对于 00110 的最后一位,我们记录的相同数字长度是 1,因为只有一个连续 0;我们记录的不同数字长度是 2,因为在 0 之前有两个连续的 1。若不同数字的连续长度大于等于当前数字的连续长度,则说明存在一个且只存在一个以当前数字结尾的满足条件的子字符串。

    class Solution {
    public:
        int countBinarySubstrings(string s) {
            int pre = 0, cur = 1, count = 0;
            for (int i = 1; i < s.length(); ++i) {
                if (s[i] == s[i-1]) {
                    ++cur;
                } else {
                    pre = cur;
                    cur = 1;
                }
                if (pre >= cur) {
                    ++count;
                }
            }
            return count;
        }
    };
    

    # 3 无重复字符的最长子串 (opens new window)

    给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。

    输入一个字符串,输出一个整数表示不含重复字符的最长子串的长度

    输入: s = "abcabcbb"
    输出: 3 
    解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
    

    解析:

    ​ 除了使用滑动窗口,本题也可以使用一个较为暴力的方法,就是在所有子串中检查是否存在重复字符。使用两层循环,外循环遍历所有子串,内循环使用哈希表检验子串中是否存在重复字符,一旦出现重复字符终止循环并记录该子串的长度。

    class Solution {
    public:
        int lengthOfLongestSubstring(string s) {
            int n = s.length();
            int ans = 0;
            for(int i=0;i<n;++i){
                unordered_set<char> hash;
                int j;
                for(j=i;j<n;++j){
                    if(hash.find(s[j])!=hash.end()){
                        break;
                    }
                    hash.insert(s[j]);
                }
                ans = max(ans,j-i);
                hash.clear();
            }
            return ans;
        }
    };
    
    上次更新: 2023/11/19, 12:55:48
    09数据结构设计
    02回文字符串

    ← 09数据结构设计 02回文字符串→

    Theme by Vdoing | Copyright © 2023-2024 Wang Qinghuan | MIT License
    • 跟随系统
    • 浅色模式
    • 深色模式
    • 阅读模式