leetcode第3題:無重復字符最長子串——平臺與vs輸出差異解析
部分用戶在LeetCode平臺和visual studio上運行LeetCode第3題“無重復字符的最長子串”代碼時,發現輸出結果存在差異。例如,輸入空字符串””時,LeetCode平臺輸出0,而Visual Studio可能輸出1。本文分析此差異產生的原因。
問題代碼片段(存在缺陷):
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { String temp1 = ""; ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < s.length(); i++) { if (!temp1.contains(String.valueOf(s.charAt(i)))) { temp1 += String.valueOf(s.charAt(i)); } else { result.add(temp1); temp1 = String.valueOf(s.charAt(i)); } } int target = 0; for (int j = 0; j < result.size(); j++) { int t = result.get(j).length(); if (t > target) { target = t; } } return target; } }
當輸入為空字符串時,循環體不會執行,result數組為空,程序直接返回target的初始值0。Visual Studio的輸出結果可能因其運行環境或其他因素而異。
問題根源: 代碼邏輯存在缺陷。循環結束后,temp1可能包含未添加到result數組中的字符串。
修正后的代碼:
import java.util.*; class Solution { public int lengthOfLongestSubstring(String s) { String temp1 = ""; ArrayList<String> result = new ArrayList<String>(); for (int i = 0; i < s.length(); i++) { if (!temp1.contains(String.valueOf(s.charAt(i)))) { temp1 += String.valueOf(s.charAt(i)); } else { result.add(temp1); temp1 = String.valueOf(s.charAt(i)); } } result.add(temp1); // 添加此行,處理最后一段子串 int target = 0; for (int j = 0; j < result.size(); j++) { int t = result.get(j).length(); if (t > target) { target = t; } } return target; } }
通過添加result.add(temp1);,即使輸入為空字符串,result數組也會包含一個空字符串,從而正確返回長度0。 LeetCode平臺的運行環境更標準化,而Visual Studio的結果可能受環境影響。 然而,即使修正后,這段代碼的效率仍然很低,不建議用于實際生產環境。 建議使用滑動窗口算法解決LeetCode第3題。
? 版權聲明
文章版權歸作者所有,未經允許請勿轉載。
THE END