java实现满足条件的最长子串的长度,滑动求解
前言
给定一个字符串,只包含字母和数字,按雯求找出字符串中的最长(连续)子串的长度,字符串本身是其最长的子串,子串要求
1、只包含1个字母(a~z,A-Z),其余必须是数字;
2、字母可以在子串中的任意位置;
如果找不到满足要求的子串,如全是字母或全是数字,则返回-1.
输入描述:
字符串(只包含字母和数字)
输出描述:
子串的长度
用例:
输入:abc1234bcd
输出:5
输入:1233a5
输出:5
输入:abcdef
输出:-1
java实现(开箱即用)
package com.des.data.test;
import jodd.util.StringUtil;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class LengthOfLongestSubstringSatisfiesCondition {
public static void main(String[] args) {
String str1 = "abc1234bcd";
String str2 = "a5";
String str5 = "1233a5";
String str3 = "abb9";
String str4 = "abcdef";
System.out.println(longestSub(str1));
}
public static Integer longestSub(String str) {
if (StringUtil.isBlank(str)) {
return -1;
}
int start = 0;
int end = 0;
int endS = 0;
StringBuffer strl = new StringBuffer();
List<String> strArr = new ArrayList<>();
List<Integer> lset = new ArrayList<>();
for (int i = 0; i < str.length(); i++) {
char inc = str.charAt(i);
if (!isdig(inc)) {
if (i + 1 < str.length() && !isdig(str.charAt(i + 1))) {
continue;
}
if (i != str.length() - 1) {
strl.append(inc);
}
for (int j = i + 1; j < str.length(); j++) {
char incj = str.charAt(j);
if (!isdig(incj)) {
end = j;
break;
}
start = i;
strl.append(incj);
}
if (start != 0 && end == 0) {
end = str.length();
}
lset.add(end - start);
strArr.add(strl.toString());
strl = new StringBuffer();
} else {
strl.append(inc);
for (int j = i + 1; j < str.length(); j++) {
char incj = str.charAt(j);
if (!isdig(str.charAt(i + 1))) {
endS = j + 1;
lset.add(end - start);
strl.append(incj);
strArr.add(strl.toString());
strl = new StringBuffer();
break;
}
}
}
if (i==endS) {
endS = 0;
}
if (i == end) {
start = 0;
end = 0;
}
}
for (int i = 0; i < strArr.size(); i++) {
System.out.println(strArr.get(i));
}
int max = Collections.max(lset);
if (max < 2) {
return -1;
}
return Collections.max(lset);
}
private static boolean isdig(char c) {
if (Character.isDigit(c)) {
return true;
}
return false;
}
}