Unique Letter String LT828
A character is unique in string S if it occurs exactly once in it.
For example, in string S = "LETTER", the only unique characters are "L" and "R".
Let's define UNIQ(S) as the number of unique characters in string S.
For example, UNIQ("LETTER") = 2.
Given a string S with only uppercases, calculate the sum of UNIQ(substring) over all non-empty substrings of S.
If there are two or more equal substrings at different positions in S, we consider them different.
Since the answer can be very large, return the answer modulo 10 ^ 9 + 7.
Idea 1. Dynamic programming, it's a bit tricky, need to store last two indexes for each char appears in the array, assume dp[i] is the number of unique characters ending at s[i]
dp[i] = dp[i-1] + (i - last[s[i]]) - (last[s[i]] - 2ndLast[s[i]]))
ABCBDAB
i = 0, {A}, dp[0] = 1
i = 1, {AB, B}, dp[1] = 3
i = 2, {ABC, BC, C}, dp[2] = 6
i = 3, {ABCB, BCB, CB, B}, dp[3] = 6 = dp[2] + (3 - 1) -(1 - (-1)) = 6
Time complexity: O(n)
Space complexity: O(n) or O(26)
class Solution {
public int uniqueLetterString(String S) {
int[] last = new int[26];
int[] secondLast = new int[26];
Arrays.fill(last, -1);
Arrays.fill(secondLast, -1);
int dp = 0;
int result = 0;
for(int i = 0; i < S.length(); ++i) {
int a = S.charAt(i) - 'A';
dp = dp + (i -last[a]) - (last[a] - secondLast[a]);
result += dp;
secondLast[a] = last[a];
last[a] = i;
}
return result;
}
}
Idea 2. Similar to Sum of Subsequence Widths LT891, instead of getting all the unique characters for substring ending at index i, focus on the contribution of each character, count how many times it appears as a unique character in a substring, then sum it up for each char in the string and get the result.
ABCBDAB, for the middle 'B', on the left, substring ending at 'B': B, CB
on the right, substring starting at 'B': B, BD, BDA
'B' can appears 2 * 3 = 6 substring, B, BD, BDA, CB, CBD, CBDA,
It can observed that the count is depend on the nearest same char on the left and on the right,
(i - prev) * (next - i)
Time complexity: O(n)
Space complexity: O(n)
Using hashmap to store the index of char in the string
class Solution {
public int uniqueLetterString(String S) {
Map<Character, List<Integer>> charIndex = new HashMap<>();
int n = S.length();
for(int i = 0; i < n; ++i) {
char c = S.charAt(i);
if(!charIndex.containsKey(c)) {
charIndex.put(c, new ArrayList<Integer>());
}
charIndex.get(c).add(i);
}
long result = 0;
long mod = (long)1e9+7;
for(List<Integer> positions: charIndex.values()) {
for(int i = 0; i < positions.size(); ++i) {
int prev = i > 0? positions.get(i-1) : -1;
int next = i < positions.size()-1? positions.get(i+1) : n;
int curr = positions.get(i);
result = (result + (curr-prev) * (next - curr))%mod;
}
}
return (int)result;
}
}
Idea 2.b store index at array prev[], next[] by scanning the string from left to right, and right to left
Time complexity: O(n)
Space complexity: O(n)
class Solution {
public int uniqueLetterString(String S) {
int n = S.length();
int[] charIndex = new int[26];
Arrays.fill(charIndex, -1);
int[] prev = new int[n];
for(int i = 0; i < n; ++i) {
int a = S.charAt(i) - 'A';
prev[i] = charIndex[a];
charIndex[a] = i;
}
Arrays.fill(charIndex, n);
int[] next = new int[n];
for(int i = n-1; i >= 0;--i) {
int a = S.charAt(i) - 'A';
next[i] = charIndex[a];
charIndex[a] = i;
}
int result = 0;
int mod = (int)(1e9) + 7;
for(int i = 0; i < n; ++i) {
result = (result + (i - prev[i])*(next[i] - i))%mod;
}
return result;
}
}
Example 1:
Input: "ABC"
Output: 10
Explanation: All possible substrings are: "A","B","C","AB","BC" and "ABC".
Evey substring is composed with only unique letters.
Sum of lengths of all substring is 1 + 1 + 1 + 2 + 2 + 3 = 10
Example 2:
Input: "ABA"
Output: 8
Explanation: The same as example 1, except uni("ABA") = 1.
Unique Letter String LT828的更多相关文章
- [Swift]LeetCode828. 独特字符串 | Unique Letter String
A character is unique in string S if it occurs exactly once in it. For example, in string S = " ...
- LeetCode828. Unique Letter String
https://leetcode.com/problems/unique-letter-string/description/ A character is unique in string S if ...
- 【leetcode】828. Unique Letter String
题目如下: A character is unique in string S if it occurs exactly once in it. For example, in string S = ...
- [LeetCode] 828. Unique Letter String 独特字符串
A character is unique in string S if it occurs exactly once in it. For example, in string S = " ...
- ORA-00001: unique constraint (string.string) violated 违反唯一约束条件(.)
ORA-00001: unique constraint (string.string) violated ORA-00001: 违反唯一约束条件(.) Cause: An UPDATE or I ...
- Swift LeetCode 目录 | Catalog
请点击页面左上角 -> Fork me on Github 或直接访问本项目Github地址:LeetCode Solution by Swift 说明:题目中含有$符号则为付费题目. 如 ...
- leetcode array解题思路
Array *532. K-diff Pairs in an Array 方案一:暴力搜索, N平方的时间复杂度,空间复杂度N 数组长度为10000,使用O(N平方)的解法担心TLE,不建议使用,尽管 ...
- All LeetCode Questions List 题目汇总
All LeetCode Questions List(Part of Answers, still updating) 题目汇总及部分答案(持续更新中) Leetcode problems clas ...
- leetcode hard
# Title Solution Acceptance Difficulty Frequency 4 Median of Two Sorted Arrays 27.2% Hard ...
随机推荐
- 63.1拓展之box-shadow属性
效果地址:https://scrimba.com/c/cQpyKbUp 效果图: HTML code: <div class="loader"></div> ...
- nginx出现404和403错误
配置文件的路径usr/local/nginx/conf/nginx.conf
- azkaban使用--schedule定时任务
1.schedule azkaban的schedule内部就是集成的quartz,而 quartz语法就是沿用linux crontab,crontab可照本文第2点 此处以此project(azka ...
- azkaban工作流调度器及相关工具对比
本文转载自:工作流调度器azkaban,主要用于架构选型,安装请参考:Azkaban安装与简介,azkaban的简单使用 为什么需要工作流调度系统 一个完整的数据分析系统通常都是由大量任务单元组成: ...
- SQL SERVER 2019新功能
1.错误代码行 BEGIN TRY SELECT 1/0END TRYBEGIN CATCH THROW END CATCH2.二级制截断列名值 chose语法
- ---Ubuntu 16.04 server 不能关机问题解决
https://serverfault.com/questions/712928/systemctl-commands-timeout-when-ran-as-root Failed to start ...
- springboot security
Authority 权限Credential 证书Grant 授予 Authentication 身份验证 以下,我们将通过四步,逐步实现spring-security的userna ...
- springmvc+mybatis环境搭建
1.spring+mybatis 环境搭建: A.配置jdbc和dbcp数据源:注意版本com.mysql.cj.jdbc.Driver B.配置sessionfactory,绑定dbcp及配置map ...
- ARTS打卡计划第二周-Review
本周review的文章是:https://medium.com/@hakibenita/optimizing-django-admin-paginator-53c4eb6bfca3 改篇文章的题目是: ...
- 微信小程序生成携带参数的小程序码
https://blog.csdn.net/qq_28988969/article/details/77969365