赞
踩
题目描述
给定一个字符串,只包含字母和数字,按要求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求:
1、 只包含1个字母(a-z, A-Z),其余必须是数字;
2、 字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1。
输入描述
字符串(只包含字母和数字)
输出描述
子串的长度
输入 | 输出 | 说明 |
---|---|---|
abC124ACb | 4 | 满足条件的最长子串是C124或者124A,长度都是4 |
a5 | 2 | 无 |
aBB9 | 2 | 满足条件的为B9,长度为2 |
abcdef | -1 | 没有满足条件的子串 |
源码和解析
解析:
将输入字符转换成单字符数组,遍历数组拿到满足条件的子串。将子串装入List,最后拿到最长子串的长度
子串开始字符是字母,下一个字母就是子串结束的标识,且不包含
子串开始字符是数字,字母出现就是子串结束的标识,要包含
所以一个子串结束时可以以字母来判断。若最后一位不是字符,是数字时不要遗漏。
示例代码:
import java.util.ArrayList; import java.util.List; public class T5 { public static void main(String[] args) { String input="abC124ACb"; char singleCases[]=input.toCharArray(); boolean isCaseStart=false;//是字符开头? StringBuilder strItem=new StringBuilder();//定义一个子串 List<String> strList=new ArrayList<String>();//所有满足条件的子串都装进来 for(int i=0;i<singleCases.length;i++){ char sc=singleCases[i]; //开始字符的处理 if(strItem.length()==0&&isCase(sc)){ //子串是空 且当前字符为字母 isCaseStart=true; strItem.append(sc); continue; }else if(strItem.length()==0&&!isCase(sc)){ //子串是空 但是当前不是字符 isCaseStart=false; strItem.append(sc); continue; } //后续字符判断 if(isCaseStart==true&&isCase(sc)){ //字母开头, 且当前字符是字母 意味着一个子串结束 if(strItem.length()>=2){ //至少包含了一个数字 strList.add(strItem.toString()); } strItem.setLength(0);//清空 strItem.append(sc);//追加新的字母 期待下一次连续 continue; } if(isCaseStart==false &&isCase(sc)){ //非字母开头,且当前字符是字母 意味着一个子串结束 当字符需要保留 strItem.append(sc); if(strItem.length()>=2){ strList.add(strItem.toString()); } isCaseStart=true;//这回字符开头了 strItem.setLength(0);//清空 strItem.append(sc);//追加新的字母 期待下一次连续 continue; } strItem.append(sc); //最后一位是数字时 必须首字符是字母 if(i==singleCases.length-1&&isCaseStart){ if(strItem.length()>=2){ strList.add(strItem.toString()); } } } int max=-1; for(String item:strList){ if(item.length()>max){ max=item.length(); } } System.out.println("满足条件最大子串:"+max); } public static boolean isCase(char item){ return (item<='z'&&item>='a') ||(item<='Z'&&item>='A'); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。