题目:
当一个字符串 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;
}
};
标签:string,int,longestNiceSubstr,枚举,美好,字符串,1763,最长
From: https://www.cnblogs.com/daniel123/p/17004741.html