首页 > 试题广场 >

偶串

[编程题]偶串
  • 热度指数:3444 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
如果一个字符串由两个相同字符串连接而成,就称这个字符串是偶串。例如"xyzxyz"和"aaaaaa"是偶串,但是"ababab"和"xyzxy"却不是。
牛牛现在给你一个只包含小写字母的偶串s,你可以从字符串s的末尾删除1和或者多个字符,保证删除之后的字符串还是一个偶串,牛牛想知道删除之后得到最长偶串长度是多少。

输入描述:
输入包括一个字符串s,字符串长度length(2 ≤ length ≤ 200),保证s是一个偶串且由小写字母构成


输出描述:
输出一个整数,表示删除之后能得到的最长偶串长度是多少。保证测试数据有非零解
示例1

输入

abaababaab

输出

6
前端铁头娃的JS实现。
	
var line = readline();
var str = line;
var l = 0;
 
for(var i=line.length; i>0; i-=2){
    str = str.slice(0, i-2);
    l = str.length;
    if(str.slice(0, l/2) === str.slice(l/2)) break;
}
 
print (l);

关键是判断一个字符串是不是偶串,其实思路很简单。我们从对字符串从0到中间位置截取一段(slice),然后再从中间位置截取剩下的那一段,比较一下两端是否相等,相等则为偶串。

还有一个关键点是,题目要求把原来的偶串从后向前截取后得到的最大长度偶串的长度。那么我们每次截取都应该是截取2个字符,确保截取后的字符串的长度是偶数,即有构成偶串的可能性。

发表于 2017-07-26 09:39:57 回复(0)

简单题,题目中把思路讲的很清楚了。从最后一个字符开始删除,看是不是偶串,如果是,直接返回了,如果不是,继续删除。

代码

import java.util.*; public class Main { public static void main(String[] args) {
        Scanner in = new Scanner(System.in); String s = in.nextLine();

        in.close();

        System.out.println(helper(s));
    } private static int helper(String s) { for(int i=s.length()-1;i>0;i--) { if(isString(s.substring(0, i))) return i;
        } return 1;
    } private static boolean isString(String s) { String front = s.substring(0, s.length()/2); String end = s.substring(s.length()/2, s.length()); return front.equals(end);
    }
}


发表于 2017-07-27 18:24:35 回复(1)
#include <iostream>
#include <string>
using namespace std;
//从后往前依次减去两个字符,判断剩下的前半部分和后半部分是否相等,相等就为偶串,直接退出,输出结果,否则继续循环
int main()
{
	string str;
	cin >> str;
	int len = str.size();
	for (int i = len-2; i >= 2; i=i-2)
	{
		int mid = i / 2;
		string s1 = str.substr(0, mid);
		string s2 = str.substr(mid, mid);
		if(s1==s2)
		{
			cout << i << endl;
			break;
		}
	}
	return 0;
}

发表于 2017-07-26 08:44:36 回复(11)
import java.util.*;
public class Main{
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        //从键盘输入一个偶串s
        String s = sc.nextLine();
        int length = s.length();
        int res = length;
        //偶串的长度一定是偶数
        int n = 2;
        for(int i=0;i<length/2-1;i++){
            String temp = s.substring(0,length-n);
            if(helper(temp)){
                res = temp.length();
                break;
            }
            n+=2;
        }
        System.out.println(res);
    }

    //写一个函数,判断传过来的字符串是否为偶串
    private static boolean helper(String s){
        int t = s.length()/2;
        String s1 = s.substring(0,t);
        String s2 = s.substring(t);
        return s1.equals(s2);
    }
}

发表于 2019-06-20 10:19:17 回复(1)
// javascript 版本
while(line=readline()) {
    var mostLen = 0;
    for(var i = 1, len = line.length; i < len; i++) {
        if(oddString(line.slice(0, len - i))) {
            mostLen = len - i;
            break;
        }
    }
    print(mostLen);
}

// 判断输入的str是否为偶串
function oddString(str) {
    var len = str.length;
    if(len % 2 == 1) return false;
    for(var i = 0; i < len/2; i++) {
        if(str[i] !== str[len / 2 + i]) {
            return false;
        }
    }
    return true;
}
编辑于 2017-09-10 21:13:04 回复(0)
import java.util.*;
public class Main3 {
	public static void main(String[] args) {
		// TODO Auto-generated method stub
        Scanner sc=new Scanner(System.in);
        while(sc.hasNext()){
        	String s=sc.nextLine();
        	for(int i=s.length()-2;i>=0;i=i-2){
        		s=s.substring(0,i);
        		if(s.substring(0,i/2).equals(s.substring(i/2))){
                	System.out.println(s.length());
                	break;
        		}
        	}
        }
        sc.close();
	}

}

发表于 2017-08-13 16:33:36 回复(0)
#include<string>
#include<iostream>
using namespace std;
int isTwo(string,int,int);
int main(){
	string x;
	while(cin>>x){
		int last,len;
		for(last=x.length()-3;last>=0;last-=2)
			if(isTwo(x,0,last)){
				len=last+1;
				break;
			}
		printf("%d\n",len);
	}
}
int isTwo(string x,int l,int r){
	int i,j;
	for(i=0,j=(r-l+1)/2;j<=r;i++,j++)
		if(x[i]!=x[j]) return 0;
	return 1;
}//数据太小  随便瞎搞

发表于 2017-08-02 19:08:32 回复(0)
#include <iostream>
#include <string>
using namespace std;
intmain()
{
    string str,tmp,tmp1,tmp2;
    getline(cin,str,'\n');
    intk=0;
    intk0 = 2;
    while(k0<str.length())
    {
        tmp1 = "";
        tmp2 = "";
        for(inti=0;i<k0/2;i++)
        {
            tmp1 += str[i];
        }
        for(inti=k0/2;i<k0;i++)
        {
            tmp2 += str[i];
        }
        if(tmp1.compare(tmp2)==0)
        {
            k = k0;
            k0+=2;
        }
        else
            k0+=2;
    }
    cout<<k<<endl;
    return0;
}

发表于 2017-08-01 11:18:42 回复(0)
import java.util.*;
 
public class Main{
    public static void main(String[] args)
        {
        int answer = 0;
        Scanner sc = new Scanner(System.in);
        String str = sc.nextLine();
        int length = str.length();
        for(int i=1;2*i<length;i++)
            {
            int p = length-1-2*i;
            for(int t=0;t<(p+1)/2;t++)
                {
                if(str.charAt(t)!=str.charAt((p+1)/2+t))
                    {
                    answer = 0;
                    break;
                }
                else{answer = length-2*i;}
            }
             if(answer != 0){System.out.println(answer);break;}
        }
        
    }
}
//比较简单粗暴的解法

发表于 2017-07-27 13:53:22 回复(0)
while(line=readline()){
    while(line.length>0){
    line=line.substring(0,line.length-2);
    let mid=line.length/2;
    let left=line.substring(0,mid);
    let right=line.substring(mid);
    if(left==right){
        console.log(line.length);
        break;
    }
    }
}
发表于 2017-07-27 09:15:10 回复(0)
import java.util.Scanner;
//思路:从偶串的末尾开始依次减少两个字符,把剩下的字符串分成两部分,判断是否相等,是就跳出循环得到长度,否就再进行
public class Main {
	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		String s=sc.nextLine();
		StringBuffer sb1=new StringBuffer(s);
		StringBuffer sb2=new StringBuffer();
		StringBuffer sb3=new StringBuffer();
		for(int i=s.length()-2;i>0;i--){
			sb1.delete(i, s.length());
			sb2.append(sb1, 0, sb1.length()/2);//前一半字符
			sb3.append(sb1, sb1.length()/2, sb1.length());//后一半字符
			if((sb2.toString()).equals(sb3.toString())){
				break;
			}
			i--;//为了实现每个减2个字符,因为偶串肯定是偶数个字符
			sb2.delete(0, sb2.length());
			sb3.delete(0, sb3.length());
		}
		System.out.println(sb1.length());
		sc.close();
	}
}

//注意:不能直接用StringBuffer的equals方法,
//因为StringBuffer并没有重写equals方法,相当于==的效果比较的两个对象的地址是否相同

发表于 2017-07-26 11:29:42 回复(0)
#include<iostream>
//#include<vector>
#include<string>
//#include <algorithm>
using namespace std;

bool IsDoubleString(string str)
{
	if (str.size()%2==1)
	{
		return false;

	}
	string s1 = str.substr(0, str.size() / 2);
	string s2 = str.substr(str.size() / 2 );
	if (s1==s2)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int main()
{
	
	string str;
	while (getline(cin,str))
	{
		int count=0;
		string s;
		for (int i = str.size()-1; i >0; i--)
		{
			 s = str.substr(0, i);
			if (IsDoubleString(s))
			{
				count = i;
				break;
			}
		}
		cout << count;
	}
	return 0;
}

发表于 2017-07-25 22:45:26 回复(0)
#include<iostream>
#include<string>

//减一个字符,从中间分开,比较俩字符串是否相等,相等的话,即为偶串,长度为其中的一个串的2倍,否则继续循环
using namespace std;

int longsame(string a)
{
	a.erase(a.end() - 1);
	while (1)
	{
		int mid = a.length() / 2;
		string left(a.begin(), a.begin() + mid);
		string right(a.begin()+mid, a.end());
		//cout << left << '\n';
		//cout << right << '\n';
		if (left == right)
		{
			if (left.length() == 0) return 0;
			return left.length() * 2;
		}
		else
		{
			a.erase(a.end() - 1);
		}
	}
}


int main_68()
{
	while (1){
		char arr[30];
		cin >> arr;
		cout << longsame(arr) << "\n";
	}
	return 0;
}


发表于 2017-07-25 21:29:06 回复(0)
public class Main { public static int longestEvenStringLength(String s) { int length = s.length(); int maxLength = 0; // 从1到字符串长度的一半进行循环 for (int i = 1; i <= length / 2; i++) { String firstHalf = s.substring(0, i); String secondHalf = s.substring(i, 2 * i); // 如果两个子串相等,说明是偶串 if (firstHalf.equals(secondHalf)) { maxLength = i * 2; // 更新最大长度 } } return maxLength; } public static void main(String[] args) { String s = "xyzxyz"; int result = longestEvenStringLength(s); System.out.println(result); // 输出:6 } }
发表于 2023-08-30 12:33:53 回复(0)
#include<iostream>
#include<string>
using namespace std;

int main(){
    string fx;
    cin>>fx;
    bool cp = true;
    for(;fx.size()>0;){
        fx.pop_back();
        int mid = fx.size() / 2;
        string s1 = fx.substr(0, mid);
        string s2 = fx.substr(mid, fx.size());
        if(s1 == s2){
            cp = false;
            printf("%d",fx.size());
            break;
        }
    }
    if(cp) printf("0");
    
    return 0;
}
思路:先删除一个字符,接着分解字符串为尽量字符相等的两串,接着比较出结果。
编辑于 2020-03-08 11:26:59 回复(0)
不太明白的是:abaababaab是由2个abaab字符串组成的,为什么输出的字符数是6而不是10?
发表于 2019-06-19 21:07:40 回复(0)
fscanf(STDIN, "%s", $s);
    getMaxLength($s);
 
    functiongetMaxLength($s){
        //$s = 'abaababaab';
        $s_len= strlen($s);
 
        if($s_len% 2 == 0){
            $s= substr($s, 0, ($s_len- 2));
        }else{
            $s= substr($s, 0, ($s_len- 1));
        }
         
        $s_len= strlen($s);
        $j= $s_len/ 2;
         
        for($i= 0; $i< $j; $i++){
            $s_len= strlen($s);
            $temp_len= $s_len/ 2;
            $s_arr= str_split($s, $temp_len);
 
            if($s_arr[0] == $s_arr[1]){
                break;
            }else{
                $s= substr($s,0, ($s_len- 2 ));
            }
        }
         
        echostrlen($s);
    }

发表于 2018-08-27 11:29:34 回复(0)
不太明白的是:abaababaab是由2个abaab字符串组成的,为什么输出的字符数是6而不是10?
发表于 2018-05-03 20:31:34 回复(0)
import java.util.Scanner;
public class Main{
 public static void main(String [] args){
        Scanner sc=new Scanner(System.in);
        String s=sc.nextLine();
     for(int i=s.length()-2;i>=2;i=i-2){
         int mid=i/2;
         String s1=s.substring(0,mid);
         String s2=s.substring(mid,i);
         if(s1.equals(s2)){
             System.out.println(i);
             break;
         }
     }
 }
}


发表于 2018-04-16 14:08:10 回复(0)

#include<iostream> #include<string> using namespace std; int main() {  string s;  int j = 1;  int count = 0;  int max = 0;  getline(cin, s);  for (int i = 1; i<s.size(); i++)  {   if (s[i] == s[0])   {    count++;    for (int n = i + 1; n<s.size(); n++){     if (s[n] == s[j])      count++;
    else      break;     j++;        }    j = 0;    if (max<count)     max = count;   }   count = 0;  }  cout << 2*max << endl; }

发表于 2018-04-02 21:47:18 回复(0)

热门推荐

通过挑战的用户

相关试题