package DP;import java.util.Scanner;/*** @author dx* @version 1.0* @date 2022年5月15日 17:30* @description: 剑指offer 48 最长不含重复字符的子字符串*/public class LongestSubWithDup {public static void main(String[] args) {Scanner sr = new Scanner(System.in);String s = sr.next();new longestSub_Soultion().longsub(s);}}class longestSub_Soultion{public void longsub(String s){int max = -1,len;len = s.length();int []position = new int[26];for(int i = 0;i < 26;i++){position[i] = -1;}int []dp = new int[len]; //dp[i]表示第i位置上最长不重复字符的长度 dp[1] = dp[0]+1(不重复的情况下),那么dp[0]设为0dp[0] = 1;for(int i = 0;i < len;i++){if(i == 0){dp[i] = dp[0];position[s.charAt(i)-'a'] = i;max = Math.max(max,dp[i]);continue;}int index = position[s.charAt(i)-'a']; //获取该字符出现的索引,如没有出现过则是-1if(index < 0 || i - index > dp[i-1]){ //index<0 说明没有重复出现dp[i] = dp[i-1]+1;}else{if(i - index <= dp[i -1]){ //如果当前索引减去上次该字符出现的索引小于等于上一个的最长不重复字符的长度 说明上次的字符是出现在dp[i-1]里的dp[i] = i - index;}}position[s.charAt(i) - 'a'] = i; //记录该字符出现过max = Math.max(max,dp[i]);}System.out.println(max);}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。