Java,给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。 - Go语言中文社区

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


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

一、题目
在这里插入图片描述二、解题:

  • 方法一,使用双层for循环,暴力求解
for(int i=0;i<=str.length()-2;i++) {
			map.put(str.charAt(i),i);
			for(int j=i+1;j<str.length();j++) {
				char key=str.charAt(j);
				if(!map.containsKey(key)) {
					map.put(key, j);
					count++;
				}else {
					max=max>count? max:count;
					count=1;
					map.clear();
					break;
				}
				max=max>count? max:count;//"au"

			}
		}
  • 使用单层for循环, value后面的重新添加,大大增加了时间,无用的步骤
for(int i=0;i<str.length();) {
			char key=str.charAt(i);
			if(!map.containsKey(key)) {
				map.put(key,i);
				count++;
				i++;
			}else {
				max=max>count? max:count;
				count=0;
				int value=map.get(key)+1;
				map.clear();
				i=value;
			}
		}
		return max>count? max:count;//" "或"a" 
  • 方法三,方法二的升级版,,删除value前面的,保留value后面的
int i=0;
		for(int j=0;j<str.length();) {
			char key=str.charAt(j);
			if(!map.containsKey(key)) {
				map.put(key, j);
				count++;
				j++;
			}else {
				max=max>count? max:count;
				int value=map.get(key)+1;
				for(;i<value;i++) {
					map.remove(str.charAt(i));
					count--;
				}
			}
		}
		return max>count? max:count;//" "或"a" 

完整代码如下:

/**
 * 给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
 * 
 * 
 * 		//将字符串-->字符数组
		char[] ch=new char[str.length()];
		str.getChars(0, str.length(), ch, 0);
		System.out.println(ch);
		
		System.out.println("".length()+"  "+" ".length());//0  1
 * @author dell
 *
 */
public class TestStringNoRepeat {
	/**
	 * n^2
	 * while循环 【不推荐使用】
	 * @param str
	 * @return
	 */
	public int solution(String str) {
        if(str.equals("") || null==str){
            return 0;
        }
		int i=0;
		int j=1;
		int max=1;
		int count=1;
		HashMap<Character,Integer> map=new HashMap<>();
		map.put(str.charAt(i), i);
		
		while(i<=str.length()-2) {
			char key=str.charAt(j);
			if(!map.containsKey(key)) {
				map.put(key, j);
				count++;
				j++;
			}else {
				map.clear();
				if(max<count) {
					max=count;
				}
				count=1;
				i++;
				map.put(str.charAt(i), i);
				j=i+1;
			}
			if(j>=str.length()) {
				return max>count? max:count;
			}
			
		}
		
		return max;
	}
	@Test
	public void test() {
//		int max=this.solution("abcdda");
//		int max=this.solution("pwwkew");
		int max=this.solution("pppp");

		System.out.println("max:"+max);
	}
	
	/**
	 * 使用双层for循环的 n^2
	 * @param str
	 * @return
	 */
	public int solution2(String str) {
        if(str.equals("") || null==str){
            return 0;
        }
		int max=1;
		int count=1;
		HashMap<Character,Integer> map=new HashMap<>();

		for(int i=0;i<=str.length()-2;i++) {
			map.put(str.charAt(i),i);
			for(int j=i+1;j<str.length();j++) {
				char key=str.charAt(j);
				if(!map.containsKey(key)) {
					map.put(key, j);
					count++;
				}else {
					max=max>count? max:count;
					count=1;
					map.clear();
					break;
				}
				max=max>count? max:count;//"au"

			}
		}
		
		return max;
	}
	@Test
	public void test2() {
		int max=this.solution2("abcdda");
//		int max=this.solution2("pwwkew");
//		int max=this.solution2("pppp");

		System.out.println("max:"+max);
	}
	
	/**
	 * 使用HashMap,一层for循环,不过远远>>n 不过速度却不快128ms
	 * @param str
	 * @return
	 */
	public int solution3(String str) {
        if(str.equals("") || null==str){
            return 0;
        }
		int max=0;
		int count=0;
		HashMap<Character,Integer> map=new HashMap<>();

		for(int i=0;i<str.length();) {
			char key=str.charAt(i);
			if(!map.containsKey(key)) {
				map.put(key,i);
				count++;
				i++;
			}else {
				max=max>count? max:count;
				count=0;
				int value=map.get(key)+1;
				map.clear();
				i=value;
			}
		}
		return max>count? max:count;//" "或"a" 
	}
	@Test
	public void test3() {
//		int max=this.solution3("abcdda");
//		int max=this.solution3("pwwkew");
		int max=this.solution3("pppp");

		System.out.println("max:"+max);
	}
	
	/**
	 * 同上,思想更加精确版  【10ms】
	 * @param str
	 * @return
	 */
	public int solution4(String str) {
        if(str.equals("") || null==str){
            return 0;
        }
		int max=0;
		int count=0;
		HashMap<Character,Integer> map=new HashMap<>();

		int i=0;
		for(int j=0;j<str.length();) {
			char key=str.charAt(j);
			if(!map.containsKey(key)) {
				map.put(key, j);
				count++;
				j++;
			}else {
				max=max>count? max:count;
				int value=map.get(key)+1;
				for(;i<value;i++) {
					map.remove(str.charAt(i));
					count--;
				}
			}
		}
		return max>count? max:count;//" "或"a" 
	}
	@Test
	public void test4() {
//		int max=this.solution4("abcdda");//4
//		int max=this.solution4("pwwkew");//3
//		int max=this.solution4("pppp");//1
		int max=this.solution4("aab");//2
		
		System.out.println("max:"+max);
	}
	
}
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_45986454/article/details/107348383
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢