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

Posted 福大大架构师每日一题

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-12-24:给定一个字符串s,其中都是英文小写字母, 如果s中的子串含有的每种字符都是偶数个, 那么这样的子串就是达标子串,子串要求是连续串。 返回s中达标子串的最大长度。 1 <= s的长相关的知识,希望对你有一定的参考价值。

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的长的主要内容,如果未能解决你的问题,请参考以下文章

c_cpp 给定字符串s,分区s使得分区的每个子字符串都是回文。返回s的所有可能的回文分区。

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。

[LeedCode]921. 使括号有效的最少添加

算法review

leetcode中等2156查找给定哈希值的子串