Задана строка S из строчных букв.Мы хотим разбить эту строку на максимально возможное количество частей, чтобы каждая буква появлялась не более чем в одной части, и возвращать список целых чисел, представляющих размер каждой части.
Input: S = "ababcbacadefegdehijhklij"
Output: [9,7,8]
Объяснение: Раздел равен "ababcbaca "," defgde "," 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 и множеством, чей максимальный размер может быть размером строки St, это также O (n)?