java字符串最长的不重复子串,找出最长不重复字符的子串

/*

* the basic idea is, keep a hashmap which stores the characters in string as keys

* and their positions as values, and keep two pointers which define the max substring.

* move the right pointer to scan through the string , and meanwhile update the hashmap.

* If the character is already in the hashmap,

* then move the left pointer to the right of the same character last found.

* Note that the two pointers can only move forward.

*/

public int lengthOfLongestSubstring(String s) {

if (s == null || s.length() < 1)

return 0;

HashMap map = new HashMap();

int max = 0;

for (int i = 0,j=0; i < s.length(); i++) {

if(map.containsKey(s.charAt(i))){

j=Math.max(j, map.get(s.charAt(i)+1));

}

map.put(s.charAt(i), i);

max=Math.max(max, i+1-j);

}

return max;

}

/*

* Solution by me Runtime: 51 ms.Your runtime beats 80.99 % of java

* submissions. 思路:确定两个指针p1和p2,再new一个HashSet用来存储subString中的字符

* 循环:p2加1,如果HashSet不含有该字符,subString长度加1;如果含有该字符,把p1指向的字符删除,p1+1

*/

public int lengthOfLongestSubstring_1(String s) {

if (s == null || s.length() < 1)

return 0;

char[] arr = s.toCharArray();

Set set = new HashSet();

set.add(arr[0]);

int p1 = 0, p2 = 1;

int tempNum = 1, res = 1;

while (p2 < s.length()) {

while (set.contains(arr[p2])) {

set.remove(arr[p1++]);

tempNum--;

}

set.add(arr[p2++]);

tempNum++;

if (tempNum > res)

res = tempNum;

}

return res;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值