列表

详情


NC200142. 好字符串

描述


由相同的字符组成的字符串称作好字符串。例如:"aaa","bbb","c"可以称作好字符串,而"abaaa", "aac", "accc"不是。现在给你一个长度为的字符串,请你找出其中长度最长的好字符串并输出。

输入描述

第一行包括一个数,代表有组数据。每组数据第一行包括一个整数,表示字符串的长度。随后输入一行字符串

输出描述

每组数据输出一行字符串S中长度最长的好字符串。如果有多个好字符串满足题目要求,则输出最先出现的。

示例1

输入:

2
12
abcdaacbbaaa
9
cccaaabbb

输出:

aaa
ccc

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 3ms, 内存消耗: 400K, 提交时间: 2023-01-14 14:47:51

#include<bits/stdc++.h>
using namespace std;
string a, b;
int len = 1;
int main()
{	
	int T;
	cin >> T;
	while (T--) {
		int length;
		cin >> length;
		cin >> a;
		int tmp = 0;
		int x = 0;
		for (int i = 1; i < length; i++) {
			if (a[i] == a[i-1]) {
				len++;
			}
			else {
				if (len > tmp) {
					b = a.substr(x, len);
					tmp = len;
				}
				x = i;
				len = 1;
			}
		}
		if (len > tmp) b = a.substr(x, len);
		cout << b << endl;
		len = 1;
	}
	return 0;
}

Pascal(fpc 3.0.2) 解法, 执行用时: 3ms, 内存消耗: 372K, 提交时间: 2019-12-08 14:45:49

program d;
 var
  n,i,l,j,k,t,x:integer;
  s:string;
begin
  readln(n);
  for i:=1 to n do
  begin
    readln(l);
    readln(s);
    x:=1;
    t:=0;
    for j:=2 to l do
      if s[j]<>s[j-1]
      then begin
        if j-x-1>t then begin t:=j-x-1; k:=x; end;
        x:=j;
      end;
    if l-x>t then begin t:=l-x; k:=x; end;
    for j:=k to k+t do
      write(s[j]);
    writeln;
  end;
end.

C++(clang++ 11.0.1) 解法, 执行用时: 3ms, 内存消耗: 436K, 提交时间: 2023-01-14 15:21:15

#include<iostream>
using namespace std;
int main()
{
	int T,n;
	char s[10000];
	scanf("%d",&T);
	while(T--)
	{
		int max=0,count=1;
		char m;
		scanf("%d",&n);
		scanf("%s",s);
		for(int i=1;i<n;i++)
		{
			if(s[i]==s[i-1]) count++;
			else count=1;
			if(count>max)
			{
				m=s[i];
				max=count;
			}
		}
		for(int i=1;i<=max;i++)
		{
			printf("%c",m);
		}
		printf("\n");
	}
	return 0;
}

C 解法, 执行用时: 2ms, 内存消耗: 436K, 提交时间: 2023-01-14 15:18:58

#include <stdio.h>
int main(){
	int n,len,i,j=0,max=0,p;
	char a[1000],t,b[1000];
	scanf("%d",&n);
	while(n!=0){
        scanf("%d",&len);
		scanf("%s",a);
		
		t=a[0];
		for(i=0;i<len;i++){
			j++;
			if(a[i]!=a[i+1]){
				if(j>max){
					max=j;
					t=a[i];
				}
				j=0;
			}
		}
		for(p=0;p<max;p++){
			b[p]=t;
			printf("%c",b[p]);
		}
		printf("\n");
		n--;
		max=0;
	}
	return 0;
}

Python3(3.9) 解法, 执行用时: 42ms, 内存消耗: 3844K, 提交时间: 2020-12-04 13:34:49

import re
from collections import namedtuple

Result = namedtuple('Result', ['string', 'index'])

case = int(input())
for _ in range(case):
    input()
    s = input()
    splitted = [i[0] for i in re.findall(r'((.)\2*)', s)]
    a = [Result(elem, idx) for (idx, elem) in enumerate(splitted)]
    print(sorted(a, key=lambda i: (len(i.string), -i.index), reverse=True)[0].string)

上一题