object LongestSubstring {
def longestSubstring(s: String): String = {
var start = 0
var maxLength = 0
var longestSubstr = ""
val charIndexMap = scala.collection.mutable.Map[Char, Int]()
for ((char, end) <- s.zipWithIndex) {
// Check if the character is already in the map and within the current window
if (charIndexMap.contains(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)
}
}
longestSubstr
}
def main(args: Array[String]): Unit = {
// Test cases
println(longestSubstring("abcabcbb")) // Output: "abc"
println(longestSubstring("bbbbb")) // Output: "b"
println(longestSubstring("xwwwqfwwxqwyq")) // Output: "xqwy"
}
}
/*
run:
abc
b
xqwy
*/