leetcode-3 无重复字符的最长字符子串

坚持打卡!


题目:

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

示例 1:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


主要思路:

1,采用双层 for 循环的方式来查找

2,第一层循环主要是标记左下标

3,第二层循环主要是标记右下标,和实现对比是否有重复值;记录最长子串信息(长度,源数据的下标)

4,输出


参考代码:

/**
 *
 * @author SanYi
 * @version leetcode-3 无重复字符的最长字符子串
 *
 */
public class Test3 {

	public static void main(String[] args) {
		// 测试
		String temp_s = "uoneywllpua156yyuomnvds";
		int[] result = getLongLeng(temp_s);
		System.out.println(temp_s + "\n的无重复字符的最长字符子串长度为:" + result[0]);
		System.out.println(temp_s.substring(result[1], result[2]));
	}

	/**
	 * 获取最长的长度方法
	 * 
	 * @param s
	 * @return int[]
	 * 
	 * */
	public static int[] getLongLeng(String s) {
		int maxLength = 0;
		// 转化为字符数组
		char[] chars = s.toCharArray();
		// 左索引
		int leftIndex = 0;
		int temp_Index1 = 0;
		int temp_Index2 = 0;

		// 循环查找,记录左边一个,往右边查看是否有重复
		for (int j = 0; j < chars.length; j++) {
			// 右边依次对比
			for (int rightIndex = leftIndex; rightIndex < j; rightIndex++) {
				// 相同
				if (chars[rightIndex] == chars[j]) {
					// 记录信息
					if ((j - leftIndex) > maxLength) {
						temp_Index1 = leftIndex;
						temp_Index2 = rightIndex + 1;
					}
					// 更新最大值并查找下一个
					maxLength = Math.max(maxLength, j - leftIndex);
					leftIndex = rightIndex + 1;
					break;
				}
			}
		}
		// 返回最长的字符串
		int[] temp = { maxLength, temp_Index1, temp_Index2 };
		return temp;
	}
}

测试结果:


总结:

这道题的实现方式有很多,我是采用了最笨的方式。就是循环不断查找对比,记录。当然很有很多优化的方法,还是需要继续学习。如写的不好,还请各位批评指正。

你可能感兴趣的:(LeetCode,java,无重复字符的最长字符子串)