如果一个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);}}}