fun longestSubstring(s: String): String {
var start = 0
var maxLength = 0
var longestSubstr = ""
val charIndexMap = mutableMapOf<Char, Int>()
for ((end, char) in s.withIndex()) {
// If the character is already in the map and within the current window
if (charIndexMap.containsKey(char) && charIndexMap[char]!! >= start) {
start = charIndexMap[char]!! + 1 // Move the start pointer to avoid duplicates
}
// Update the character's latest index
charIndexMap[char] = end
// Check if the current substring is the longest
val currentLength = end - start + 1
if (currentLength > maxLength) {
maxLength = currentLength
longestSubstr = s.substring(start, end + 1)
}
}
return longestSubstr
}
fun main() {
// Test cases
println(longestSubstring("abcabcbb")) // Output: "abc"
println(longestSubstring("bbbbb")) // Output: "b"
println(longestSubstring("xwwwqfwwxqwyq")) // Output: "xqwy"
}
/*
run:
abc
b
xqwy
*/