如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。
小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。
输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1'
输出一个整数,表示最长的满足要求的子串长度。
111101111
3
import java.util.*;
public class Main{
public static void main(String[]args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
String str=sc.nextLine();
System.out.println(helper(str));
}
}
public static int helper(String str){
int count=1,cur=1;
char[]cs=str.toCharArray();
for(int i=0;i<cs.length-1;i++){
if(cs[i]!=cs[i+1]){
cur++;
count=Math.max(cur,count);
}else{
cur=1;
}
}
return count;
}
} import java.util.Scanner;
/**
* @Author: coderjjp
* @Date: 2020-05-13 17:21
* @Description: 交错01串
* @version: 1.0
*/
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.next();
int cur = 1;
int ans = 1;
for (int i = 1; i < s.length(); i++){
if (s.charAt(i) != s.charAt(i - 1))
cur++;
else
cur = 1;
ans = Math.max(ans, cur);
}
System.out.println(ans);
}
} import java.util.*;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner cin=new Scanner (System.in);
String str=cin.nextLine();//读入字符串
int n=str.length();
int temp=1;//暂时变量
int out=1;//要输出的变量
for(int i=1;i<n;i++) {
if(str.charAt(i) !=str.charAt(i-1)) {
temp++;
// System.out.println(i+" "+str.charAt(i));
}
else {
out=Math.max(temp, out);
temp=1;
}
}
out=Math.max(temp, out);
System.out.print(out);
}
}
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
int max= 1;
int cout=1;
for(int i=0;i<str.length()-1;i++){
if(str.charAt(i)!=str.charAt(i+1)){
cout++;
max=max>cout?max:cout;
continue;
}
cout=1;
}
System.out.println(max);
}
} import java.util.Scanner;
public class Main { public static Scanner scan=new Scanner(System.in); public static void main(String[] args) { String n=scan.next(); int array[]=new int[n.length()]; String[] temp=n.split(""); int num=1; for (int i = 0; i < n.length()-1; i++) { if(!temp[i].equals(temp[i+1]) ){ num+=1; array[i] = num; }else { array[i] = num; num=1; } } int number=0; for (int i = 0; i < array.length-1; i++) { if(array[i]>number) { number=array[i]; } } System.out.println(number); }
}
由于已经只确定输入字符只有0和1,所以用一个变量存储前一个字符,然后每次都跟当前字符进行对比看是否不同,最长字串长度设为count,如果相同则count++,否则count更新为1。
import java.util.Scanner;
public class Main {
public static int process(String str) {
if (str.length() < 1) {
return 0;
}
char pre = str.charAt(0);
int count = 1;
int max = 0;
for (int i = 1; i < str.length(); i++) {
if (str.charAt(i) != pre) {
pre = str.charAt(i);
count++;
} else {
count = 1;
}
max = Math.max(count, max);
}
return max;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
System.out.println(process(str));
}
}
解体思路很简单,常规的获取数据就先不提了,都快写吐了。
有两个方法:计数法和子串法
第一种方法:
分析该字符的下一个字符是否与之相等
若不同计数加一,相同计数清零
输出计数值(101)3
但碰到1011这样的数据计数就不会保存(1011)0
所以加上了中继变量,每次字符相同后仅计数变量清零
输出计数值(1011)3
但碰到了1010010这样的数据中继变量会被覆盖(1010010)3
所以加上了结果变量,当其小于中继变量时就将中继变量赋值给结果变量
成功解决问题。
附上代码:
import java.io.*;
public class Main{
public static void main(String[]args)throws IOException{
//直到长度合法为止的循环
boolean flag = true;
String str;
do{
//开流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//获取数据
str = br.readLine();
//判断str合法性
if(str.length() <= 50&&str.matches("[0-1]+")){
flag = false;
}
//关流
br.close();
}while(flag);
//计数变量
int count = 0;
int temp = 0;
int max = 0;
for(int i = 0;i < str.length() - 1;i++){
//如果这个数的下一个数字与这个数字不同
if(str.charAt(i) != str.charAt(i+1))
count = ++temp;
else
temp = 0;
if(max < count)
max = count;
}
System.out.println(max + 1);
}
}
第二种方法:
做完这个题目后看评论有说用子串解题的,正好就写了一个
解题思路如下
交错01串只有两种状态010..和101...
写一个从最理想状态(字符串是交错01串)到最不理想状态(字符串是纯0或纯1)的循环
当交错01串是字符串的子串的时候返回01串的长度
若不符合结果就让两个交错01串缩容。
附上代码:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
public class Main{
public static void main(String[]args)throws IOException{
//直到长度合法为止的循环
boolean flag = true;
String str;
do{
//开流
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
//获取数据
str = br.readLine();
//判断str合法性
if(str.length() <= 50&&str.matches("[0-1]+")){
flag = false;
}
//关流
br.close();
}while(flag);
//新建两个等于字符串长度的字符串010..和101...
char[] c1 = new char[str.length()];
char[] c2 = new char[str.length()];
for(int i = 0;i < c1.length;i++){
if(flag){
c1[i] = '1';
c2[i] = '0';
flag = !flag;
}
else{
c1[i] = '0';
c2[i] = '1';
flag = !flag;
}
}
//直到这两个字符串任意一个是str的子串的话就返回结果值
while(!(str.contains(new String(c1))||str.contains(new String(c2)))){
//若不是子串就让两个字符串缩容1
c1 = Arrays.copyOf(c1,c1.length-1);
c2 = Arrays.copyOf(c2,c2.length-1);
}
System.out.println(c1.length);
}
}
遍历一遍字符串就好了,找出最长字串
定义一个ArrayList存储所有的长度值,最后答案取ArrayList的最大值;从头遍历,判断后面一个字符是否等于前面一个字符,如果不相等,则count+1;将前面那个字符更新为当前字符,如果相等,则将当前的count加入到ArrayList,令count为1 ,重新计数。每轮循环结束前将count加入到ArrayList中,最后取ArrayList的最大值。
}
import java.util.*;
public class Main{
public static void main(String[] args){
try(Scanner in = new Scanner(System.in)){
String s = in.nextLine();
System.out.println(helper(s));
}
}
public static int helper(String s){
char[] c = s.toCharArray();
int max = 1,l = 1,i = 1;
while(i < c.length){
if(c[i - 1] != c[i]) l++;
else {
if(l > max) max = l;
l = 1;
}
i++;
}
return l > max ? l : max;
}
}
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
char[] arr=str.toCharArray();
int maxlen=1;
int len=1;
for(int i=0;i<arr.length-1;i++){ if(arr[i]!=arr[i+1]){ len++; if(len>maxlen){
maxlen=len;
}
}
else
len=1; //让长度重新归位,不然会一直做累加
}
System.out.println(maxlen);
}
}
importjava.util.Scanner;publicclassMain {publicstaticvoidmain(String[] args) {Scanner in = newScanner(System.in);while(in.hasNext()) {String data = in.next();finalintlen = data.length();intindex = 0;intmaxLen = 1;for(inti = 1; i < len; ++i) {if(data.charAt(i) == data.charAt(i - 1)) {maxLen = Math.max(maxLen, i - index);index = i;}}maxLen = Math.max(maxLen, len - index);System.out.println(maxLen);}}}