求无重复字符的最长子串

问题:

JAVA算法题:求无重复字符的最长子串


解题过程:

键盘录入一串字符,创建哈希表对字符进行遍历存储比较,定义开始位置为start,结尾位置为end.遍历过程中,当遇到字符相同的情况,利用哈希表的key值,value值,将相同字符作为key寻找到value,并将start位置更新到这个相同字符处继续进行遍历,每次遍历都会比较字串的大小更新结果,同时也更新哈希表中的元素.

代码

代码如下:

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class zuichangzichuan {

    public int lengthOfLongestSubstring(String s) {
        int n  = s.length(),result = 0;
        //创建一个哈希表
        Map<Character,Integer> map = new HashMap<>();
        for (int start = 0,end = 0;end<n;end++){
            //charAt 返回指定索引位置的处的字符,超出有效范围的索引值返回空字符串。
            char ele = s.charAt(end);
            //判断该key在map中是否有key存在。
            if (map.containsKey(ele)){
                //Math.max(参数1,参数2)是一个静态的工du具方法,
                // 主要用来比较两个相zhi同类型参数的大小,支持的类型有double,float,int,long四种类型.
                //get(key)指定键映射到的值,如果此映射不包含键的映射,则为NULL。
                start = Math.max(map.get(ele),start);
            }
            //比较原来最大子字符串长度与新子字符串的长度
            result = Math.max(result,end-start+1);
            //V.put(K key, V value)key - 与指定值相关联的键。
            //                     value - 与指定键关联的值。
            //当存在这个key的时候,新的会覆盖掉原来的value并返回oldvalue,也就是旧值
            map.put(s.charAt(end),end+1);
        }
        System.out.println("最大子字符串的长度为:");
        return result;
    }
    public static void main(String[] args) {
        Scanner sc =new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String s = sc.nextLine();
        zuichangzichuan lengthOfLongestSubstring = new zuichangzichuan();
        System.out.println(lengthOfLongestSubstring.lengthOfLongestSubstring(s));
    }
}

总结

以上就是如何去求无重复字符的最长子串,其中charAt ()返回指定索引位置的处的字符,超出有效范围的索引值返回空字符串;
containsKey()判断该key在map中是否有key存在;
Math.max(参数1,参数2)是一个静态的工du具方法,主要用来比较两个相zhi同类型参数的大小,支持的类型有double,float,int,long四种类型.
get(key)指定键映射到的值,如果此映射不包含键的映射,则为NULL。
V.put(K key, V value)key - 与指定值相关联的键。value - 与指定键关联的值。当存在这个key的时候,新的会覆盖掉原来的value并返回oldvalue,也就是旧值;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值