给出小写字母的字符串S。我们希望将此字符串分成尽可能多的部分,以便每个字母最多显示一个部分,并返回代表每个部分大小的整数列表。
Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
说明: 分区是“ ababcbaca”,“ defegde”,“ hijhklij”。 这是一个分区,以便每个字母最多显示一个部分。
像“ ababcbacadefegde”,“ hijhklij”这样的分区是不正确的,因为它将S分割成更少的部分。
以下是我针对上述问题的代码:
class Solution {
public List<Integer> partitionLabels(String S) {
char[] st = S.toCharArray();
int k=0,c=0;
List<Integer> res = new ArrayList<Integer> ();
Set<Integer> visited = new HashSet<Integer> ();
for(int i=0 ; i<st.length ; i++)
{
int idx = S.lastIndexOf(st[i]);
if(visited.add(i) && idx>i && idx>k)
{
k = Math.max(k,idx);
visited.add(k);
}
else if(i == k)
{
res.add(i-c+1);
c=i+1;
k++;
}
}
return res;
}
}
由于上面的代码访问每个元素一次,因此上面的代码有效并且上面的代码在O(n)中的时间复杂度。
但是空间复杂度是多少?因为我使用的Char数组的大小与String S相同,并且使用Set的Max大小可以是String S的大小,所以它也是O(n)吗?
答案 0 :(得分:0)
由于仅使用一维数组并列出您的空间复杂度为O(n)。
但是您的时间复杂度是O(n²),因为S.lastIndexOf(st[i]);
是O(n)。
如果您还想成为O(n),则必须对字符串进行一次预处理(= O(n)),以确定每个字符的最后一次出现f.i。与地图保持检索时间O(1)。