给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、"b"、“c”、“x”、"y"、“z”在字符串中都恰好出现了偶数次(0也是偶数)
let findsubStr = str => {
let res = 0; // res为满足条件的字符串的最大长度
let state = 0; // 表示字符串的当前状态,eg: state = 000001 表示当前字符a出现了奇数次,其他都出现了偶数次
// letterMap存储的是各字符串对应的状态
let letterMap = {
a: 1,
b: 2,
c: 4,
x: 8,
y: 16,
z: 32
};
// map的key是state,value是当前字符的位置
let map = {0: -1};
for(let i=0;i<str.length;i++) {
let char = str[i]; // char为当前遍历到的字符
// 如果当前字符是a,b,c,x,y,z中的一个,则需要对当前状态进行异或运算,即更新字符出现的次数
if(letterMap[char] !== undefined) {
state ^= letterMap[char];
if(map[state] === undefined) {
map[state] = i;
}
}
let distance = i-map[state];
res = Math.max(res, distance);
}
return res;
}
let str = readline();
print(findsubStr(str)); import java.util.*;
public class Main{
public static void main(String[] args) {
// write your code here
Scanner scanner = new Scanner(System.in);
String next = scanner.next();
System.out.println(findTheLongestSubstring(next));
}
private static int findTheLongestSubstring(String s) {
Map<Integer, Integer> map = new HashMap<>();
int state = 0;
int maxlen = 0;
// 初始化
map.put(0, -1);
// a b c x y z 分别在第123456个bit,来表示出现次数的奇偶性
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == 'a') state ^= 0x000001;
if (s.charAt(i) == 'b') state ^= 0x000010;
if (s.charAt(i) == 'c') state ^= 0x000100;
if (s.charAt(i) == 'x') state ^= 0x001000;
if (s.charAt(i) == 'y') state ^= 0x010000;
if (s.charAt(i) == 'z') state ^= 0x100000;
if (map.containsKey(state)) {
maxlen = Math.max(maxlen, i - map.get(state));
} else {
map.put(state, i);
}
}
return maxlen;
}
} //位运算+dp
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner cin=new Scanner(System.in);
while(cin.hasNext()){
String str=cin.nextLine();
int[] dp=new int[str.length()];
dp[0]=judge(str.charAt(0));
for(int i=1;i<str.length();++i){
int temp=judge(str.charAt(i));
if(temp==0)
dp[i]=dp[i-1];
else
dp[i]=dp[i-1]^temp;
}
int ans=0;
for(int i=0;i<str.length();++i){
for(int j=i;j<str.length();++j){
if((dp[j]^dp[j-i]^judge(str.charAt(j-i)))==0){
ans=i+1;
break;
}
}
}
System.out.println(ans);
}
}
public static int judge(char cr){
if(cr=='a')
return 1;
if(cr=='b')
return 2;
if(cr=='c')
return 4;
if(cr=='x')
return 8;
if(cr=='y')
return 16;
if(cr=='z')
return 32;
return 0;
}
}
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String s = br.readLine();
int len = s.length();
int maxcnt = 0;
if (s == null || (len) < 1) {
System.out.println(0);
return;
}
for (int i = 0; i < len; i++) {
for (int j = i + 1; j < len; j++) {
if (maxcnt < j - i + 1) {
if (check(s.substring(i, j + 1))) {
maxcnt = j - i + 1;
}
}
}
}
System.out.println(maxcnt);
}
private static boolean check(String substring) {
int[] cntArray = new int[6];
for (int i = 0; i < substring.length(); i++) {
if (substring.charAt(i) == 'a') {
cntArray[0]++;
} else if (substring.charAt(i) == 'b') {
cntArray[1]++;
} else if (substring.charAt(i) == 'c') {
cntArray[2]++;
} else if (substring.charAt(i) == 'x') {
cntArray[3]++;
} else if (substring.charAt(i) == 'y') {
cntArray[4]++;
} else if (substring.charAt(i) == 'z') {
cntArray[5]++;
}
}
if (cntArray[0] % 2 == 0 && cntArray[1] % 2 == 0 && cntArray[2] % 2 == 0 && cntArray[3] % 2 == 0 && cntArray[4] % 2 == 0 && cntArray[5] % 2 == 0) {
return true;
} else {
return false;
}
}
} import java.util.HashMap;
import java.util.HashSet;
import java.util.*;
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
// 定义目标字符集合
Set<Character> targetChars = new HashSet<>();
targetChars.add('a');
targetChars.add('b');
targetChars.add('c');
targetChars.add('x');
targetChars.add('y');
targetChars.add('z');
int maxRes = 0;
// 外层循环遍历所有可能的子串起始位置
for (int i = 0; i < s.length(); i++) {
// 存储目标字符的出现次数
Map<Character, Integer> charCount = new HashMap<>();
// 内层循环遍历从起始位置开始的所有可能的子串结束位置
for (int j = i; j < s.length(); j++) {
char c = s.charAt(j);
if (targetChars.contains(c)) {
// 更新字符出现次数
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
boolean allEven = true;
// 检查所有目标字符的出现次数是否为偶数
for (char target : targetChars) {
int count = charCount.getOrDefault(target, 0);
if (count % 2 != 0) {
allEven = false;
break;
}
}
if (allEven) {
// 若所有目标字符出现次数为偶数,更新最大长度
maxRes = Math.max(maxRes, j - i + 1);
}
}
}
System.out.println(maxRes);
}
} import java.util.*;
public class Main {
// 出现偶数次-前缀和+状态压缩
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.nextLine();
int[] pos = new int[64]; // 64个状态
Arrays.fill(pos, Integer.MAX_VALUE);
int max = 0, state = 0; // 状态压缩为数字的位
pos[0] = -1; // 前缀和base case
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == 'a') { // 第一位
state ^= 1;
} else if (c == 'b') {
state ^= 2;
} else if (c == 'c') {
state ^= 4;
} else if (c == 'x') {
state ^= 8;
} else if (c == 'y') {
state ^= 16;
} else if (c == 'z') { // 第六位
state ^= 32;
}
if (pos[state] != Integer.MAX_VALUE) { // 状态再一次出现说明经过偶数次-前缀和思想
max = Math.max(max, i - pos[state]);
} else { // 状态第一次出现
pos[state] = i; // 存下标
}
}
System.out.println(max);
}
}
let intS = readline()
// 构造函数,功能是传入字符串看是否满足条件:“a”、"b"、“c”、“x”、"y"、“z”在字符串中都恰好出现了偶数次(0也是偶数)
function func(s){
let arr = ['a','b','c','x','y','z']
for(let v of arr){
if(charNum(s,v)%2 !== 0){
return 0
}
}
return s.length
}
// 判断某字符c在字符串s出现次数的函数
function charNum(s,c){
let arr = s.split(c)
return arr.length-1
}
let arrNum = []
let Max = 0
for(let i=0;i<intS.length;i++){
for(let j=i+1;j<=intS.length;j++){
if(intS.slice(i,j).length<=Max) continue
let count = func(intS.slice(i,j))
Max = Math.max(Max,count)
}
}
print(Max)
import java.util.*;
public class Main {
public static void main(String[] arg){
Scanner sc=new Scanner(System.in);
String word=sc.next();
int n=word.length();
int length=0;
//暴力遍历从每个点开始算
for (int i = 0; i <n; i++) {
int[] mark=new int[26];
for (int j = i; j <n; j++) {
//标记每个字母的个数
mark[word.charAt(j)-'a']++;
//有符合题目的情况就更新length
if(mark['a'-'a']%2==0&&mark['b'-'a']%2==0&&mark['c'-'a']%2==0&&mark['x'-'a']%2==0&&mark['y'-'a']%2==0&&mark['z'-'a']%2==0){
length=Math.max(length,j-i+1);
}
}
}
System.out.print(length);
}
} import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
//String s = "amac";
HashMap<Character,Integer> map = new HashMap<>();
map.put('a',0);
map.put('b',0);
map.put('c',0);
map.put('x',0);
map.put('y',0);
map.put('z',0);
for(int j = s.length();j>=0;j--){
String tmp = s.substring(0,j);
if(fun(map,tmp)==true){
System.out.println(tmp.length());
return;
}else{
map.put('a',0);
map.put('b',0);
map.put('c',0);
map.put('x',0);
map.put('y',0);
map.put('z',0);
}
}
}
public static boolean fun(HashMap<Character,Integer> map,String s){
int i = 0;
while(i<s.length()){
char tmp = s.charAt(i);
if(tmp!='a' && tmp!='b' && tmp!='c' && tmp!='x' && tmp!='y' && tmp!='z'){
//res = res + String.valueOf(tmp);
}else{
//res = res + String.valueOf(tmp);
map.put(tmp,map.get(tmp)+1);
}
i++;
}
if(map.get('a')%2!=0)
return false;
if(map.get('b')%2!=0)
return false;
if(map.get('c')%2!=0)
return false;
if(map.get('x')%2!=0)
return false;
if(map.get('y')%2!=0)
return false;
if(map.get('z')%2!=0)
return false;
return true;
}
}
通过率50%,是时间复杂度太高吗?
//通过率60%,不知道哪里出了问题,大佬们帮忙看看
import java.util.*;
public class Main{
public static void main(String args[]){
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
int res=0;
String str;
for(int i=0;i<s.length();i++){
for(int j=i+1;j<=s.length();j++){
str=s.substring(i,j);
if(isRight(str)){
res=Math.max(str.length(),res);
}
}
}
System.out.println(res);
}
public static Boolean isRight(String s){
int a=0,b=0,c=0,x=0,y=0;
for(int i=0;i<s.length();i++){
switch(s.charAt(i)){
case 'a':a++;
break;
case 'b':b++;
break;
case 'c':c++;
break;
case 'x':x++;
break;
case 'y':y++;
break;
default:
break;
}
}
if(a%2==0&&b%2==0&&c%2==0&&x%2==0&&y%2==0){
return true;
}else return false;
}
} 只能通过一半,哪位大佬帮忙看一下出错在哪了?😭
#include
using namespace std;
int main(){
string str;
cin>>str;
map H;
bool *flag = new bool[str.length()];
memset(flag, 0, sizeof(flag));
for(long long i=0; i<str.length(); i++){
if(str[i]=='a'||str[i]=='b'||str[i]=='c'||str[i]=='x'||str[i]=='y'||str[i]=='z'){
H[str[i]]++;
}
if(H['a']%2==0&&H['b']%2==0&&H['c']%2==0&&H['x']%2==0&&H['y']%2==0&&H['z']%2==0){
//flag[i]等于1表示从下标0到i的子串满足条件
flag[i] = 1;
}
}
long long res = 0;
for(long long i=str.length()-1; i>=0; i--){
if(flag[i]==1){
res = i+1;
break;
}
}
cout<<res<<endl;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
public class Main {
public static void main(String[] args) {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
char[] str= new char[0];
try {
str = br.readLine().toCharArray();
} catch (IOException e) {
e.printStackTrace();
}
int n=str.length;
int ans=0;
boolean judgement=true;
HashMap<Character,Integer> map=new HashMap<Character, Integer>();
for(int i=0;i<n;i++)
{
map.put('a',0);
map.put('b',0);
map.put('c',0);
map.put('x',0);
map.put('y',0);
map.put('z',0);
for(int j=i;j<n;j++) {
judgement = true;
if (map.containsKey(str[j])) {
int num = map.get(str[j]) + 1;
map.put(str[j], num);
for (Object key : map.keySet()) {
if (map.get(key) % 2 != 0) {
judgement = false;
break;
}
}
if (judgement == true)
if(j-i+1>ans)
{
ans=j-i+1;
}
} else {
for (Object key : map.keySet()) {
if (map.get(key) % 2 != 0) {
judgement = false;
break;
}
}
if (judgement == true)
if(j-i+1>ans)
{
ans=j-i+1;
}
}
}
}
System.out.println(ans);
}
}
import java.util.Arrays;
import java.util.Map;
import java.util.Scanner;
public class oddtimes {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String s = sc.nextLine();
int[] pos = new int[1 << 6];//存储64种状态第一次出现的位置
Arrays.fill(pos,-1);
pos[0] = 0;
int now = 0;
int maxlen = 0;
for (int i = 0; i < s.length(); i++) {
switch (s.charAt(i)) {
case 'a': {
now ^= 1;
}
break;
case 'b': {
now ^= 2;
}
break;
case 'c': {
now ^= 4;
}
case 'x': {
now ^= 8;
}
break;
case 'y': {
now ^= 16;
}
break;
case 'z': {
now ^= 32;
}
break;
default:
break;
}
if (pos[now] >= 0) {
maxlen = Math.max(maxlen, i - pos[now] + 1);
} else {
pos[now] = i + 1;
}
}
System.out.println(maxlen);
}
}
import sys def findSame(s): if s == None: return 0 length = len(s) target = 0 for i in range(length): j = i + 1 while j < length: if s[i] == s[j]: number = j - i + 1 if number > target: target = number j += 1 return target if __name__ == '__main__': s = list(input()) print(findSame(s))