1763. 最长的美好子字符串 暴力枚举

题目:

当一个字符串 s 包含的每一种字母的大写和小写形式 同时 出现在 s 中,就称这个字符串 s 是 美好 字符串。比方说,"abABB" 是美好字符串,因为 'A' 和 'a' 同时出现了,且 'B' 和 'b' 也同时出现了。然而,"abA" 不是美好字符串因为 'b' 出现了,而 'B' 没有出现。

给你一个字符串 s ,请你返回 s 最长的 美好子字符串 。如果有多个答案,请你返回 最早 出现的一个。如果不存在美好子字符串,请你返回一个空字符串。

示例 1:

输入:s = "YazaAay"
输出:"aAa"
解释:"aAa" 是一个美好字符串,因为这个子串中仅含一种字母,其小写形式 'a' 和大写形式 'A' 也同时出现了。
"aAa" 是最长的美好子字符串。

示例 2:

输入:s = "Bb"
输出:"Bb"
解释:"Bb" 是美好字符串,因为 'B' 和 'b' 都出现了。整个字符串也是原字符串的子字符串。

示例 3:

输入:s = "c"
输出:""
解释:没有美好子字符串。

示例 4:

输入:s = "dDzeE"
输出:"dD"
解释:"dD" 和 "eE" 都是最长美好子字符串。
由于有多个美好子字符串,返回 "dD" ,因为它出现得最早。

提示:

  • 1 <= s.length <= 100
  • s 只包含大写和小写英文字母。

因为字符串并不是很长,总规模不会很大,枚举所有以不同位置的字符开始的子字符串是否是美好字符串,选取最长的那一个

class Solution {
public:
    bool compare2case(int *arr1,int *arr2,int len){   //比较大小写字母序为下标的数组是否相等
        for(int i = 0;i < len;i++){
            if (*arr1++ != *arr2++) return false;
        }
        return true;
    }
    string longestNiceSubstring(string s) {  //算法思想,暴力枚举,枚举出以所有位置开头的字符串是否是美好字符串,一个位置开头的美好字符串一定有最长的。如果他是最长的,一定是全局最长,因为位置是从左往后枚举,所以也肯定是首先出现的。
        string longestNiceSubstr;
        int longestNicelegth = 0;
        for(int i = 0;i < s.size();i++){
            int lowercase[26] = {0};   //使用整数的不同二进制位来保存该字符是否在字符串中出现过
            int uppercase[26] = {0};
            if(s[i]-'A' <= 26){// 起始字符是大写字符
                uppercase[s[i]-'A']=1;   //是第几个大写字母,就把uppercase 中第几个位置上的位域置1
            }else{
                lowercase[s[i]-'a']=1;
            }    
            //枚举以i开始的,j结束的子字符串
            for(int j = i+1;j < s.size();j++){
                if(s[j] - 'A' <= 26 ){
                    uppercase[s[j]-'A']=1;
                }else{
                    lowercase[s[j]-'a']=1;
                }
                //每次多增加一个字母,查看一下该子串是不是美好字符串
                if(compare2case(uppercase,lowercase,26)){
                    if(j-i + 1 > longestNicelegth){
                        longestNicelegth = j - i + 1;
                        longestNiceSubstr = s.substr(i,j-i+1);
                    }
                    //是美好字符串,但是不是最长的,忽略
                }
            }
        }
        return longestNiceSubstr;
    }
};
 
判断一个字符串 是否 大小写的字母都有,除了上面的这种用两个字母数组来确定之外,还可以使用26个二进制位来唯一确定,那一个字母存在,那么对应的二进制位就是1,如果不存在就是0
这样判断一个字符串是否大小写都存在就更快一些了,不过用两个字母数组来确定会更通用一些。
class Solution {
public:
    string longestNiceSubstring(string s) {
        string longestNiceSubstr;
        int longestNicelegth = 0;
        for(int i = 0;i < s.size();i++){
            int lowercase = 0;   //使用整数的不同二进制位来保存该字符是否在字符串中出现过
            int uppercase = 0;
            if(s[i]-'A' <= 26){// 起始字符是大写字符
                uppercase |= (1<<(s[i]-'A'));   //是第几个大写字母,就把uppercase 中第几个位置上的位域置1
            }else{
                lowercase |= (1<<(s[i]-'a'));
            }    
            //枚举以i开始的,j结束的子字符串
            for(int j = i+1;j < s.size();j++){
                if(s[j] - 'A' <= 26 ){
                    uppercase |= (1<<(s[j]-'A'));
                }else{
                    lowercase |= (1<<(s[j]-'a'));
                }
                //每次多增加一个字母,查看一下该子串是不是美好字符串
                if(uppercase == lowercase){
                    if(j-i + 1 > longestNicelegth){
                        longestNicelegth = j - i + 1;
                        longestNiceSubstr = s.substr(i,j-i+1);
                    }
                    //是美好字符串,但是不是最长的,忽略
                }
            }
        }
        return longestNiceSubstr;
    }
};
 
posted @ 2022-12-25 22:11  danieldai  阅读(34)  评论(0编辑  收藏  举报