需要为我的LeetCode problem解决方案找到Big O复杂性。
我无法估计由于在检测到重复字符时队列中重复删除而导致的复杂性,如果没有该重复字符,则由于单个for循环遍历字符串,因此它应该是O(n)。
发布问题的要点和我的解决方案供您参考:
给定一个字符串,找到没有的最长子字符串的长度 重复人物。
示例:
鉴于“abcabcbb”,答案是“abc”,长度为3。
鉴于“bbbbb”,答案是“b”,长度为1。
鉴于“pwwkew”,答案是“wke”,长度为3.注意 答案必须是一个子字符串,“pwke”是一个子序列,而不是一个 串。
我的解决方案:
import java.util.Hashtable;
public class Solution {
public int lengthOfLongestSubstring(String s) {
Queue<Character> q = new LinkedList<Character>();
Hashtable<Character, Boolean> chars = new Hashtable<Character, Boolean>();
int maxLen = 0;
for (int i = 0; i < s.length(); i++)
{
char ch = s.charAt(i);
if (!chars.containsKey(ch))
{
q.add(ch);
chars.put(ch,true);
}
else
{
int len = q.size();
System.out.println(len);
while(q.peek()!=ch)
{
chars.remove(q.remove());
}
q.remove();
q.add(ch);
if (len > maxLen)
maxLen = len;
}
}
if (q.size() > maxLen)
return q.size();
return maxLen;
}
}
答案 0 :(得分:0)
您的解决方案将是O(n)。 for循环中的内容并不重要,而是循环运行的次数。这是因为循环的内部部分将是一些任意数量的操作,这些操作只是一个常量。因为在大O中我们不关心常数,更重要的是循环运行的次数,即N.
也许有些数学可以帮助证明:
说N = 5并且您不知道循环将执行多少操作,但是您知道它将运行5次。首先假装它只进行一次操作,当然操作次数是5,即1 * N.然后假装循环执行100次操作,然后操作次数为500,即100 * N.在这两种情况下,大O都是O(n)。然后,您可以假设对于某些任意数量的循环操作,您仍将获得O(n)。我不知道数学的有效性,但一般的想法是有道理的。