利用集合来取出连续的不重复的字符串

文章介绍了如何利用Java的List集合和滑动窗口算法解决求给定字符串中最长不重复子串的问题。通过遍历和比较字符,将不重复的子串添加到集合并更新左边界,最终输出最长的子串。同时,也提供了另一种非集合方法的实现
摘要由CSDN通过智能技术生成

想法:

由于list集合能存储不重复的对象且有序,利用list.get(i)便可以取出对象。利用这一特性,便可以解决此问题。

代码实现:


import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Javatest {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String str = sc.next();

//由于str.charAt(0)为字符不是字符串,则在后面加上一个""来组成字符串。
        String s =str.charAt(0)+"";

//存储不重复的字符串
        List<String>list = new ArrayList<>();
        for (int i = 0; i <str.length() ; i++) {
            for (int j = 0; j <s.length() ; j++) {
                if(str.charAt(i)!=str.charAt(j)){
                    s= s+str.charAt(i);//将不重复的字符连接到一起(+)
                }else if(str.charAt(i)==str.charAt(j)) {
                    list.add(s);//如果遇到重复的字符就将此字符以前的字符串存入集合

//更新左边界,从重复的字符重新开始连接连续的不重复的字符。
                    s= str.charAt(i)+"";
                }else if( i==str.length()-1){
                    list.add(str.charAt(i)+"");
                }
            }
        }

                int max=0;//记录最长的索引
                for (int i = 0; i <list.size()-1 ; i++) {
                            if(list.get(i).length()<list.get(i+1).length()){
                               max=i+1;
                    }
        }
System.out.println(list.get(max));

    }
}

可以举几个例子来推敲。

eg:

" abdcdabgab  "

str:a+""

......

str:abdcd,由于后面是a,a已经出现。则将abdcd存入list集合中。

list(0)="abdcd";

更新左边界 s= str.charAt(i)+"";从a+""重新开始。

str=abg,由于a出现了,则将abg存入list集合中.

list(1)="abg";

同理:

list(2)="ab";

比较长度。

得到结果:最后输出"abdcd"

下面是不用集合的做法:

public class Java09 {
    public static String lengthOfLongestSubstring(String s){
        int i=0,j=0,temp=0,result=0;
        //判断长度是否为0
        if (s.length()==0) return 0;
        //判断是否为“ ”
        if (s.equals(" ")) return 1;
        //判断是否为单个字符串
        if (s.length()==1) return 1;
        for(i=1;i<s.length();i++){
            for (j=temp;j<=i;j++){
                if(s.charAt(j)==s.charAt(i))
                {
                    if(j!=i){
                        temp=j+1;//将temp左移,抵消掉相同变为不同,有点像滑窗模型
                    }
                    break;
                }
            }
            if(result<i-temp+1){
                result=i-temp+1;
            }
        }
        return
return s.substring(temp,temp+result);;
    }


    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串");
      String s = sc.next();
        System.out.println(s+"的长度为:"+lengthOfLongestSubstring(s));
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

前进别停留

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值