Java C++ 算法leetcode828统计子串中唯一字符乘法原理

 更新时间:2022年09月14日 09:51:11   作者:AnjaVon  
这篇文章主要为大家介绍了Java C++ 算法leetcode828统计子串中唯一字符乘法原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

题目要求

思路:模拟

解题的核心思想在于逆向思维,不考虑每个子数组中的唯一字符个数,转而考虑每个字符可以作为多少个子数组的唯一字符

  • 所以在计算答案时的算式和示例中给出的是不一样的;
  • 在计算每个字符“贡献”【即当前向左向右分别可组成的答案个数】的时候要用到乘法原理

对每一个字符s[i]s[i]s[i]都记录其左边和右边的第一个相同字符位置,分别记为l[i]l[i]l[i]和r[i]r[i]r[i],这两个位置中间构成的就是s[i]s[i]s[i]能够作为唯一字符的最长子串,在这个最长的子串中还有若干个较短的子串,此时s[i]s[i]s[i]的“贡献”可由到左边和到右边的距离相乘计算得出。

java

class Solution {
    public int uniqueLetterString(String s) {
        char[] cs = s.toCharArray();
        int n = cs.length, res = 0;
        int[] l = new int[n], r = new int[n];
        int[] letters = new int[26];
        Arrays.fill(letters, -1);
        for (int i = 0; i < n; i++) {
            int idx = cs[i] - 'A';
            l[i] = letters[idx]; // 左边第一个相同的字符所在位置
            letters[idx] = i; // 更新当前字母最新左位置
        }
        Arrays.fill(letters, n);
        for (int i = n - 1; i >= 0; i--) {
            int idx = cs[i] - 'A';
            r[i] = letters[idx]; // 右边第一个相同的字符所在位置
            letters[idx] = i; // 更新当前字母最新右位置
        }
        for (int i = 0; i < n; i++)
            res += (i - l[i]) * (r[i] - i);
        return res;
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

C++

  • 因为memset初始化问题,所以在构成结果的时候多一步判断。
class Solution {
public:
    int uniqueLetterString(string s) {
        int n = s.size(), res = 0;
        cout << n << endl;
        int l[n], r[n];
        int letters[26];
        memset(letters, -1, sizeof(letters));
        for (int i = 0; i < n; i++) {
            int idx = s[i] - 'A';
            l[i] = letters[idx]; // 左边第一个相同的字符所在位置
            letters[idx] = i; // 更新当前字母最新左位置
        }
        memset(letters, -1, sizeof(letters));
        for (int i = n - 1; i >= 0; i--) {
            int idx = s[i] - 'A';
            r[i] = letters[idx]; // 右边第一个相同的字符所在位置
            letters[idx] = i; // 更新当前字母最新右位置
        }
        for (int i = 0; i < n; i++) {
            int ri = r[i] == -1 ? n : r[i];
            res += (i - l[i]) * (ri - i);
        }
        return res;
    }
};
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

Rust

  • 用Rust的遍历稍微改一下,思路一样……
impl Solution {
    pub fn unique_letter_string(s: String) -> i32 {
        let cs = s.as_bytes();
        (0..s.len()).into_iter().map(|i| {
            let (mut l, mut r) = (i - 1, i + 1);
            while l < s.len() && cs[l] != cs[i] {
                l -= 1;
            }
            while r < s.len() && cs[r] != cs[i] {
                r += 1;
            }
            ((i - l) * (r - i)) as i32
        }).sum::<i32>()
    }
}
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

以上就是Java C++ 算法leetcode828统计子串中唯一字符乘法原理的详细内容,更多关于Java C++ 统计子串唯一字符的资料请关注脚本之家其它相关文章!

相关文章

  • Qt编写地图实现海量点位标注

    Qt编写地图实现海量点位标注

    海量点位标注的出现,是为了解决普通设备点超过几百个性能极速降低的问题。本文将介绍如何通过Qt实现海量点位标注功能,感兴趣的可以了解一下
    2022-01-01
  • C++ COM编程之QueryInterface函数(一)

    C++ COM编程之QueryInterface函数(一)

    这篇文章主要介绍了C++ COM编程之QueryInterface函数(一),QueryInterface是组件本身提供对自己查询的一个接口,需要的朋友可以参考下
    2014-10-10
  • 使用c语言输出杨辉三角形的简单方法

    使用c语言输出杨辉三角形的简单方法

    这篇文章主要给大家介绍了关于如何使用c语言输出杨辉三角形的简单方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Qt实现字幕滚动效果的示例代码

    Qt实现字幕滚动效果的示例代码

    这篇文章主要介绍了Qt如何利用QTimer实现字幕滚动功能,并且可以实现自行更改文本内容、自适应文本大小、自由调整速度等功能,感兴趣的可以学习一下
    2022-06-06
  • C语言中字符串处理函数sscanf的用法

    C语言中字符串处理函数sscanf的用法

    一直对于一些日期字符串中数字的提取比较头疼,现看到 sscanf 对于字符串中的内容提取较方便,本文主要介绍了C语言中字符串处理函数sscanf的用法,具有一定参考价值,感兴趣的可以了解一下
    2023-08-08
  • C++ 中

    C++ 中"priority_queue" 优先级队列实例详解

    这篇文章主要介绍了C++ 中"priority_queue" 优先级队列实例详解的相关资料,需要的朋友可以参考下
    2017-04-04
  • 基于SVN源码服务器搭建(详细教程分析)

    基于SVN源码服务器搭建(详细教程分析)

    本篇文章是对SVN源码服务器搭建进行了详细的分析介绍,需要的朋友参考下
    2013-06-06
  • Qt实现一个简单的word文档编辑器

    Qt实现一个简单的word文档编辑器

    本文主要介绍了Qt实现一个简单的word文档编辑器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • C++实现LeetCode(166.分数转循环小数)

    C++实现LeetCode(166.分数转循环小数)

    这篇文章主要介绍了C++实现LeetCode(166.分数转循环小数)
    2021-07-07
  • C++中std::find函数介绍和使用场景

    C++中std::find函数介绍和使用场景

    std::find函数是一个非常实用的通用查找算法,适用于各种场景,本文主要介绍了C++中std::find函数介绍和使用场景,具有一定的参考价值,感兴趣的可以了解一下
    2024-02-02

最新评论