NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)

简介: NetEase网易 Java笔试题 给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b“、“c”、“x”、“y“、“z”在字符串中都恰好出现了偶数次(0也是偶数)

给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、"b"、“c”、“x”、"y"、“z”在字符串中都恰好出现了偶数次(0也是偶数)

题目描述

给定一个字符串,请返回满足以下条件的最长字符串的长度:“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)


输入例子1:

abcda

输出例子1:

1

例子说明1:

子串中只有d满足要求

输入例子2:

acmdcb

输出例子2:

4

例子说明2:

子串中cmdc满足要求


题目分析

使用HashMap来存放数据。Key存放“a”、“b”、“c”、“x”、“y”、“z”的状态,Value存放长度,int型变量maxLen存放最长字串长度。


在Key中,“a”、“b”、“c”、“x”、“y”、“z”各占一位标志位,对于字符串s,对其进行遍历,如果发现字符为“a”、“b”、“c”、“x”、“y”、“z”其中一个,则改变Key中对应的标志位。字符串中出现过奇数次上述字符,则对应位置为1,否则为0。如果出现已经出现过的标志位,则证明从出现过标志位的位置到现在满足“a”、“b”、“c”、“x”、“y”、“z”在字符串中都恰好出现了偶数次(0也是偶数)这一条件,可直接用当前的Value减去上次出现该标志位的Value,然后与当前的maxLen对比取大值即可。


代码实现

import java.util.*;
public class Main{
    public static void main(String[] args)
    {
        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);   
        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;   
    }
}
目录
相关文章
|
3天前
|
Java 索引
String字符串常用函数以及示例 JAVA基础
String字符串常用函数以及示例 JAVA基础
|
4天前
|
Java
Java 字符串分割split空字符串丢失解决方案
Java 字符串分割split空字符串丢失解决方案
|
4天前
|
Java
Java获取字符串最后一位
【5月更文挑战第9天】Java获取字符串最后一位
26 5
|
2天前
|
存储 Java
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
Java基础复习(DayThree):字符串基础与StringBuffer、StringBuilder源码研究
|
2天前
|
SQL Java 数据库连接
Java笔试题
Java笔试题
|
3天前
|
Java
Java中两个字符串进行大小比较
Java中两个字符串进行大小比较
17 5
|
4天前
|
存储 Java 索引
【JAVA基础篇教学】第十一篇:Java中字符串操作详解
【JAVA基础篇教学】第十一篇:Java中字符串操作详解
|
4天前
|
Java
代码实例演示Java字符串与输入流互转
代码实例演示Java字符串与输入流互转
|
4天前
|
传感器 数据采集 网络协议
Java串口通信:从十六进制字符串到字节数组的正确转换与发送
Java串口通信:从十六进制字符串到字节数组的正确转换与发送
32 4
|
4天前
|
Java
在Java中,如何将字符串转换为浮点数?
【4月更文挑战第30天】在Java中,如何将字符串转换为浮点数?
17 0