To find the last substring in lexicographical order, we want the substring that starts at the position of the largest suffix. We can use a two-pointer approach to efficiently find the starting index of this substring by comparing suffixes directly.
classSolution {
public: string lastSubstring(string s) {
int n = s.size(), i =0, j =1, k =0;
while (j + k < n) {
if (s[i + k] == s[j + k]) {
++k;
} elseif (s[i + k] < s[j + k]) {
i = max(i + k +1, j);
k =0;
j = i +1;
} else {
j = j + k +1;
k =0;
}
}
return s.substr(i);
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
funclastSubstring(sstring) string {
n:= len(s)
i, j, k:=0, 1, 0forj+k < n {
ifs[i+k] ==s[j+k] {
k++ } elseifs[i+k] < s[j+k] {
i = max(i+k+1, j)
k = 0j = i+1 } else {
j = j+k+1k = 0 }
}
returns[i:]
}
func max(a, bint) int { ifa > b { returna } else { returnb } }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
classSolution {
public String lastSubstring(String s) {
int n = s.length(), i = 0, j = 1, k = 0;
while (j + k < n) {
if (s.charAt(i + k) == s.charAt(j + k)) {
k++;
} elseif (s.charAt(i + k) < s.charAt(j + k)) {
i = Math.max(i + k + 1, j);
k = 0;
j = i + 1;
} else {
j = j + k + 1;
k = 0;
}
}
return s.substring(i);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
classSolution {
funlastSubstring(s: String): String {
val n = s.length
var i = 0; var j = 1; var k = 0while (j + k < n) {
if (s[i + k] == s[j + k]) {
k++ } elseif (s[i + k] < s[j + k]) {
i = maxOf(i + k + 1, j)
k = 0 j = i + 1 } else {
j = j + k + 1 k = 0 }
}
return s.substring(i)
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
classSolution:
deflastSubstring(self, s: str) -> str:
n = len(s)
i, j, k =0, 1, 0while j + k < n:
if s[i + k] == s[j + k]:
k +=1elif s[i + k] < s[j + k]:
i = max(i + k +1, j)
k =0 j = i +1else:
j = j + k +1 k =0return s[i:]
impl Solution {
pubfnlast_substring(s: String) -> String {
let s = s.as_bytes();
let n = s.len();
let (mut i, mut j, mut k) = (0, 1, 0);
while j + k < n {
if s[i + k] == s[j + k] {
k +=1;
} elseif s[i + k] < s[j + k] {
i = (i + k +1).max(j);
k =0;
j = i +1;
} else {
j = j + k +1;
k =0;
}
}
String::from_utf8(s[i..].to_vec()).unwrap()
}
}