首页 > 试题广场 >

交错01串

[编程题]交错01串
  • 热度指数:35208 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串。例如: "1","10101","0101010"都是交错01串。
小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串。小易需要你帮帮忙求出最长的这样的子串的长度是多少。

输入描述:
输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1'


输出描述:
输出一个整数,表示最长的满足要求的子串长度。
示例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;
    }
}

发表于 2020-08-30 10:57:29 回复(0)
动态规划入门题目
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);
    }
}


发表于 2020-05-13 17:29:24 回复(0)
Java 语言     看代码说话
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);

	}

}


编辑于 2019-11-04 16:45:13 回复(0)
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        Scanner in = new Scanner(System.in);
        String str = in.next();
        char[] chs = str.toCharArray();
        int res = 1;
        int tmp = 1;
        for(int i = 1;i<chs.length;i++){
            tmp = chs[i] != chs[i-1]?tmp+1:1;
            res = Math.max(res,tmp);
        }
        System.out.println(res);
    }
}
发表于 2019-09-07 20:47:44 回复(0)
#只有前后两个数字不一样的cout计数才开始;max记录最大cout,输出max即可;
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);
    }
}


编辑于 2019-08-26 22:19:42 回复(0)
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);     }

}

发表于 2019-06-28 16:57:45 回复(0)

由于已经只确定输入字符只有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));
    }
}
发表于 2019-06-10 14:11:05 回复(0)
解体思路很简单,常规的获取数据就先不提了,都快写吐了。
有两个方法:计数法和子串法
第一种方法:
分析该字符的下一个字符是否与之相等
若不同计数加一,相同计数清零
输出计数值(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);
    }
}


编辑于 2019-06-07 17:39:51 回复(0)
import java.util.*;
public class Main{
    public static void main(String[] args){
       Scanner sc = new Scanner(System.in);
  String s = sc.nextLine();
  int sum = 0;
  out: for (int i = 1; i < s.length(); i++) {
   if (s.charAt(i) != s.charAt(i - 1)) {
    for (int j = i; j < s.length(); j++) {
     if (s.charAt(j) == s.charAt(j - 1)) {
      if (sum < j + 1 - i) {
       sum = j + 1 - i;
      }
      break;
     }
     if (j == s.length() - 1) {
      if (sum < j + 2 - i)
       sum = j + 2 - i;
      break out;
     }
    }
   }
  }
        if(sum==0)    //当没有交错串的时候,默认长度是1
            sum=1;
  System.out.println(sum);
    }
}
发表于 2019-04-09 00:39:46 回复(0)
动态规划思想。和最长子序列同理吧,我按这个思路修改的。
例如110110101,字符串最长01串是10101,长度5
new一个长度为9数组初始化为1
前后2个比较,若不相等则为01,这时sum[i+1]=sum[i]+1;
最后输出数组最大数值可得解。

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        
        Scanner in=new Scanner(System.in);
        String str=in.nextLine();
        //String str="110110101";
        int[] sum=new int[str.length()];//new一个长度为9数组
        for(int i=0;i<str.length();i++) {
            sum[i]=1;//数组初始化为1
        }
        
        fun(str,sum);
        int max=1;
        for(int i=0;i<str.length();i++) {
            if(max<sum[i])max=sum[i];
        }
        System.out.println(max);
    }
    public static void fun(String str,int[] sum) {
        for(int i=0;i<str.length()-1;i++) {
            if(str.charAt(i)==str.charAt(i+1))continue;
            else sum[i+1]=sum[i]+1;
        }
    }
}

发表于 2019-04-08 03:15:10 回复(0)
import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while(sc.hasNext()) {
            String str = sc.next();
            int len = SubstringLargestLength(str);
            System.out.println(len);
        }
    }
    public static int SubstringLargestLength(String str) {
        int[] str_int = new int[str.length()];
        for(int i = 0; i < str.length(); i++) {
            str_int[i] = str.charAt(i);
        }
        int largestLength = 0;
        int length = 1;
        for(int i = 1; i < str_int.length; i++) {
            if(str_int[i]!=str_int[i-1]) {
                length++;
            }
            else {
                if(largestLength < length) {
                    largestLength = length;
                }
                length = 1;
            }
        }
        if(largestLength < length) {
            largestLength = length;
        }
        return largestLength;
    }
}
发表于 2019-04-06 12:28:14 回复(0)
遍历一遍字符串就好了,找出最长字串

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        String str=sc.nextLine();
        char[] ch=str.toCharArray();
        int num=1,max=1;
        boolean flag=true;
        
        for(int i=0;i<ch.length-1;i++) {
            if(ch[i]!=ch[i+1]) {
                num++;
            }else {
                flag=false;
                if(num>max) {
                    max=num;
                    num=1;
                }else {
                    num=1;
                }
            }    
        }
        if(flag)
            max=num;
        System.out.println(max);
    }

}
发表于 2019-03-25 20:31:43 回复(0)
定义一个ArrayList存储所有的长度值,最后答案取ArrayList的最大值;从头遍历,判断后面一个字符是否等于前面一个字符,如果不相等,则count+1;将前面那个字符更新为当前字符,如果相等,则将当前的count加入到ArrayList,令count为1 ,重新计数。每轮循环结束前将count加入到ArrayList中,最后取ArrayList的最大值。
import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class Main{
    public static void main(String[] args) {
        Scanner scanner =new Scanner(System.in);
        String string = scanner.nextLine();
        int count =1;
        ArrayList<Integer> result = new ArrayList<>();
        char temp = string.charAt(0);
        for(int i=1;i<string.length();i++) {
            if(string.charAt(i) != temp) {
                count ++;
                temp = string.charAt(i);
            }else {
                result.add(count);
                count = 1;
            }
            result.add(count);
        }
        System.out.println(Collections.max(result));
    }
}

发表于 2019-03-10 16:09:57 回复(0)
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;
    }
}


发表于 2019-01-12 14:08:42 回复(0)
importjava.util.Scanner ;
 
publicclassMain{
    publicstaticvoidmain(String args[]){
        Scanner in = newScanner(System.in);
        String str = in.nextLine() ;
        intmax = 1, len = 1;
        for(inti = 1; i < str.length() ; i++){
            if(str.charAt(i - 1) != str.charAt(i)){
                len++ ;
                if(len > max){
                    max = len ;
                }
            }else{
                len = 1;
            }
        }
        System.out.println(max) ;
    }
}
发表于 2017-10-18 18:21:43 回复(0)
package com.asjy.wang;

public class ha {
public static void main(String[] args) {
int s[] = {1,1,1,0,0,1};
int count = 0;
int last = 0;
int k = 1 ;
int flag = 0;
int b =0;
for(int i = 0;i<s.length-1;i++){
if(s[i]!=s[i+1]){
   k=k+1;
   count = k;
   b = count;
}
if(s[i]==s[i+1]){
  flag = 1;
  k = 1;
  System.out.println("l:"+last+"c:"+count);
  if(last < count){
      last = count;
      count = 0;
  }
   count = 0;
}
}
if(flag == 0){
System.out.println(b);
   }else{
    System.out.println(last);
   }
}
}
eclipse 结果是对的 在这就是报错 我服了 真不知道哪错了 
发表于 2017-09-03 00:15:30 回复(0)

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);
}
}

编辑于 2017-08-13 22:06:23 回复(0)
import java.util.Scanner;

public class Main {

    /**
     * 思路:
            lptr指针记录当前以当前位置为尾的满足条件交错01串的最左位置;
            每当不满足条件的元素出现时,就更新记录最长子串长度的变量maxDis,并更新lptr使其等于当前元素的下标。
     */
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        Scanner reader = new Scanner(System.in);
        String str = reader.nextLine();
        int maxDis = Integer.MIN_VALUE;
        int lptr = 0;
        for(int i = 1; i < str.length(); i++){
            if(str.charAt(i) == str.charAt(i-1)){
                maxDis = Math.max(maxDis, i-lptr);
                lptr = i;
            }
        }
        if(lptr == 0 || lptr != str.length()-1)
            maxDis = Math.max(maxDis,str.length()-lptr);
        System.out.println(maxDis);
    }

}
发表于 2017-08-13 16:02:49 回复(0)
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);
        }
    }
}

发表于 2017-08-13 13:13:47 回复(0)