给出一个小写字母的字符串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)吗?

最佳答案

由于仅使用一维数组并列出您的空间复杂度,因此为O(n)。

但是您的时间复杂度是O(n²),因为S.lastIndexOf(st[i]);是O(n)。

如果您还希望时间变为O(n),则必须对字符串进行一次预处理(= O(n)),以确定每个字符的最后一次出现f.i.与地图,以保持检索时间O(1)。

10-08 11:00