题目:对于一个字符串,请设计一个高效算法,找到字符串的最长无重复字符的子串长度。
给定一个字符串A及它的长度n,请返回它的最长无重复字符子串长度。保证A中字符全部为小写英文字符,且长度小于等于500。测试样例:"aabcb",5返回:3
思路:何为无重复子串,所谓无重复子串是指内部没有相同的字符的字符串,在遍历一个字符串时,如果遇到的字符串在之前的字符串中已经存在了那么这个字符串就不再是无重复字符串了。题目要求最终返回无重复子串的最长值。本题技巧性较强,我们知道一个字符串必定有头有尾,在求最长无重复字符串时可以遍历字符串,从头开始计算从该字符开始的最长无重复字符串长度,直到遇到重复的字符为止,逐个字符求从该字符开始的最长长度,逐步保留最长长度,当数组遍历完成时就得到了整个数组中最长无重复字符串的长度。但是这样从头开始求不重复长度每个字符需要再遍历n个字符,时间复杂度是O(n^2)。换种思路,遍历字符串数组,计算以每个字符结尾的字符串中的最长无重复长度,算出他的长度,遍历数组,即计算以每个字符结尾的最长无重复字符串长度,保留最长长度值,当数组遍历完成时就得到了整个数组的最长无重复长度。关键是如何求以每个字符结尾的最长无重复长度。这里利用动态规划的思想,计算某个字符array[i]的最长无重复长度,就是需要得到从该字符array[i]开始向左最远可以到达哪里使得字符串不出现重复,即确定某个位置array[A],在array[A]~ array[i]之间没有重复字符,array[i]再往左就出现了重复字符,于是对于每个字符array[i],关键是确定它的最左边的不重复字符的位置A,而这个位置A是如何确定的呢?A的位置来源有两种可能:对于a