2022-12-24:给定一个字符串s,其中都是英文小写字母,
如果s中的子串含有的每种字符都是偶数个,
那么这样的子串就是达标子串,子串要求是连续串。
返回s中达标子串的最大长度。
1 <= s的长度 <= 10^5,
字符种类都是英文小写。
来自微软。

答案2022-12-24:

shell编写的代码真慢。
map存status最早状态的序号+status整型存26个字母的状态。
注意还没遍历的时候map[0]=-1,这是最早的状态。
时间复杂度:O(N)。
空间复杂度:O(N)。

代码用shell编写。代码如下:

#!/bin/bash

# public static int getMax(int a, int b)
function getMax()
{
if [ $1 -gt $2 ];then
echo $1
else
echo $2
fi
} # public static boolean ok(String s, int l, int r)
function ok(){
eval s=\$$1
local l=$2
local r=$3
if [ $[($r-$l+1)&1] == 1 ]
then
return 0
fi local cnts=()
local i=0
while [ $i -lt 26 ]
do
cnts[$i]=0
i=$[$i+1]
done i=$l
while [ $i -le $r ]
do
local c=${s:$i:1}
local num=$(echo $c| tr -d "\n" | od -An -t dC)
num=$[$num-97]
cnts[$num]=$[${cnts[$num]}+1]
i=$[$i+1]
done i=0
while [ $i -lt 26 ]
do
if [ $[${cnts[$i]}&1] == 1 ]
then
return 0
fi
i=$[$i+1]
done return 1
} # public static int maxLen1(String s)
function maxLen1(){
eval s=\$$1
local n=${#s}
local ans=0
local i=0
while [ $i -lt $n ]
do
local j=$[$n-1]
while [ $j -ge $i ]
do
ok s $i $j
if [ $? == 1 ]
then
ans=$(getMax $ans $[$j-$i+1])
fi
j=$[$j-1]
done
i=$[$i+1]
done echo $ans
} # public static int maxLen2(String s)
function maxLen2(){
eval s=\$$1
local n=${#s}
declare -A map
map[0]=-1
local status=0
local ans=0
local i=0
while [ $i -lt $n ]
do
local c=${s:$i:1}
local num=$(echo $c| tr -d "\n" | od -An -t dC)
num=$[$num-97]
num=$[1<<$num]
status=$[($status)^($num)]
if [ "${map[$status]}" = "" ]
then
map[$status]=$i
else
ans=$(getMax $ans $[$i-${map[$status]}])
fi
i=$[$i+1]
done echo $ans
} # 为了测试
# public static String randomString(int n, int v)
function randomString(){
local n=$1
local v=$2
local i=0
local ans=""
while [ $i -lt $n ]
do
local temp=$RANDOM%$v
temp=$[$temp+97]
local a=$(echo $temp | awk '{printf("%c", $1)}')
ans=$ans$a
i=$[$i+1]
done
echo $ans
} # 为了测试
function main(){
local s="moonfdd"
echo $(maxLen1 s)
echo $(maxLen2 s) local n=6
local v=6
local testTimes=5
printf "测试开始\r\n"
local i=0
while [ $i -lt $testTimes ]
do
printf "i = %d\r\n" $i
local s=$(randomString $n $v)
printf "s = %s\r\n" $s
local ans1=$(maxLen1 s)
local ans2=$(maxLen2 s)
if [ $ans1 != $ans2 ]
then
printf "%s\r\n" s
printf "%s\r\n" ans1
printf "%s\r\n" ans2
break
fi
printf "ans = %s\r\n" $ans1
printf "end===============\r\n"
i=$[$i+1]
done
printf "测试结束\r\n" } main maxLen1

2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s中达标子串的最大长度。 1 <= s的长的更多相关文章

  1. 算法:Manacher,给定一个字符串str,返回str中最长回文子串的长度。

    [题目] 给定一个字符串str,返回str中最长回文子串的长度 [举例] str="123", 1 str="abc1234321ab" 7 [暴力破解] 从左 ...

  2. 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...

  3. 【leetcode-03】给定一个字符串,请你找出其中不含有重复字符的最长子串的长度

    开个新坑,leetcode上面做题目.下面是题目描述: <!-- 给定一个字符串,请你找出其中不含有重复字符的最长子串的长度. 示例 1: 输入: "abcabcbb" 输出 ...

  4. 给定一个字符串,仅由a,b,c 3种小写字母组成。

    package com.boco.study; /** * 题目详情 给定一个字符串,仅由a,b,c 3种小写字母组成. 当出现连续两个不同的字母时,你可以用另外一个字母替换它,如 有ab或ba连续出 ...

  5. 给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换)

    需求:给定一个字符串str,将str中连续两个字符为a的字符替换为b(一个或连续超过多个字符a则不替换) 如: a 不替换 b 不替换  ab 不替换 ba 不替换 aba 不替换  aab 替换为 ...

  6. 给定一个字符串,根据字符出现频率排序--Java实现

    题目描述: 给定一个字符串,请将字符串里的字符按照出现的频率降序排列. 示例 1: 输入:"tree" 输出:"eert" 解释:'e'出现两次,'r'和't' ...

  7. 给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后。 要求:空间复杂度是O(1),且只能遍历一次字符串。

    题目:给定一个字符串里面只有"R" "G" "B" 三个字符,请排序,最终结果的顺序是R在前 G中 B在后. 要求:空间复杂度是O(1),且 ...

  8. 核心API的使用(给定一个字符串,统计每个字符出现的次数)

    /** * 给定一个字符串,统计每个字符出现的次数. 如:abdaewrwqask435a1aasd */public class ReplaceString { static int length; ...

  9. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字符不改变,给定函数,编写函数 void Stringchang(const char*input,char*output)其中input是输入字符串,output是输出字符串

    import java.util.Scanner; /*** * 1. 给定一个字符串,把字符串内的字母转换成该字母的下一个字母,a换成b,z换成a,Z换成A,如aBf转换成bCg, 字符串内的其他字 ...

  10. LeetCode 151:给定一个字符串,逐个翻转字符串中的每个单词 Reverse Words in a String

    公众号:爱写bug(ID:icodebugs) 翻转字符串里的单词 Given an input string, reverse the string word by word. 示例 1: 输入: ...

随机推荐

  1. 上位机-串口通信详解(以RS232为例))

    1.什么是串口通信? 写这个的时候我在想应该怎么解释串口通信,因为串口通信很多朋友不了解的原因是涉及到硬件的知识,对于没有相关专业知识的朋友很难理解串口通信.所以我这里只做部分的解释,需要了解更多硬件 ...

  2. UAC的详细讲解(转载)

    win32中也有对UAC的操作方法 网址:https://blog.csdn.net/zuishikonghuan/article/details/46965159?locationNum=7& ...

  3. 三艾云 Kubernetes 集群最佳实践

    三艾云 Kubernetes 集群最佳实践 三艾云 Kubernetes 集群最佳实践 容器是 Cloud Native 的基石,它们之间的关系不言而喻.了解容器对于学习 Cloud Native 也 ...

  4. 如何搭建属于自己的服务器(Linux7.6版)

    从0搭建属于自己的服务器 最近小伙伴推荐的华为云活动,购买服务器相当的划算,本人也是耗费巨资购买了一台2核4G HECS云服务器. 话不多说,在这里给华为云打一个广子,活动力度还是很不错的. 活动详情 ...

  5. 如何自动化测试你的接口?—— Rest Assured

    前言 不知道大家的项目是否都有对接口API进行自动化测试,反正像我们这种小公司是没有的.由于最近一直被吐槽项目质量糟糕,只能研发自己看看有什么接口测试方案.那么在本文中,我将探索如何使用 Rest A ...

  6. Linux Bash Shell 中变量的 5 个易错点

    Linux 中的 Bash 脚本支持对变量的操作,下面咸鱼将介绍 Linux Bash Shell 中关于变量的 5 个易错点 因为编程习惯,这类现象往往发生在大多数使用过其他流行编程语言的程序员身上 ...

  7. new做了哪些事情,手写一个new

    1)创建一个空对象,将构造函数中的this指向这个空对象 2)将空对象的__proto__指向构造函数的prototype原型 3)执行构造函数里面的代码,为这个空对象添加属性和方法 4)返回一个新的 ...

  8. 基于Admin.NET框架的前端的一些改进和代码生成处理(1)

    Admin.NET 是一套基于Furion/.NET 6实现的通用管理平台,模块插件式开发,框架包含了常规的权限管理.字典等管理模块,以及一些Vue3的Demo案例,框架前后端分离.后端基于基于Fur ...

  9. 探究平台化设计的核心思想和Lattice的设计原则

    一. 平台对业务敏捷支撑的挑战 早期阿里的交易中台遇到了一些挑战,这个在毗卢的博客中有提到,主要遇到了这些问题:新小业务都有一个成长规律,在早期业务模式验证阶段,需要的玩法比较简单,希望能频繁的发布快 ...

  10. SMT贴片加工钢网工艺制作方法

    smt贴片加工过程中,首先要进行锡膏印刷,而锡膏印刷的工作原理就是用机器刮刀将锡膏推送到钢网的孔洞中,使锡膏与pcb板的电子元器件接触,为下一步焊接做准备.钢网的作用就是与pcb板焊盘位置固定,使锡膏 ...