5. このプログラミングコードを、より効率的なバージョンに書き換えてください。
```
func findLongestSubstring(input string) string {
    maxLength := 0
    startIndex := 0
    currentMaxIndex := 0
    charMap := make(map[rune]int)
    for i, char := range input {
        if lastIndex, found := charMap[char]; found && lastIndex >= startIndex {
            startIndex = lastIndex + 1
        }
        if i+1-startIndex > maxLength {
            maxLength = i + 1 - startIndex
            currentMaxIndex = startIndex
        }
        charMap[char] = i
    }
    return input[currentMaxIndex:currentMaxIndex+maxLength]
}
```
```
func findLongestSubstring(input string) string {
    charMap := make(map[rune]int)
    maxLength := 0
    startIndex := 0
    for i, char := range input {
        lastIndex, found := charMap[char]
        if found && lastIndex >= startIndex {
            startIndex = lastIndex + 1
        }
        if i+1-startIndex > maxLength {
            maxLength = i + 1 - startIndex
        }
        charMap[char] = i
    }
    return input[startIndex:startIndex+maxLength]
}
```
上記の変更は、変数 currentMaxIndex を削除し、戻り値を startIndex と maxLength を使用して計算することで、コードの重複を減らしています。