LeetCode1839. 所有元音按顺序排布的最长子字符串

LeetCode

 

我的思路: 有点像滑动窗口 

  (  没注意看题目条件,都是元音,而自己写的任何字符都能判断 ,麻烦了一点 )

 

    1.单独定义一个元音字符串用于判断。

    2.‘a’ 是判断美丽字符串的入口, 先在word中找到 ‘ a ’,

    3. 从 ' a '该 下标向后在word中找连续的 元音字母    

   4.找到美丽字符串和之前的相比,取字符串个数最大值

class Solution {
public:
    int longestBeautifulSubstring(string word) 
    {
        int size = word.size();

	if (size < 5) //如果个数 < 5 肯定不是
		return 0;

	string dict = "aeiou";
	int Maxret = 0;
	int i = 0;

	while (i <= (size - 5)) //如果i前面判断过后字符个数 < 5 也不会有美丽字符串了
	{
		if (word[i] == 'a') //判断美丽字符串的入口
		{   
			int index = i + 1; //从第二个字符开始向后判断
			
			int j = 0;

			while(j < 5) // j用于指向 元音字母
			{
				if (word[index] == dict[j]) //后序有元音字母 
				{
					if (index < size) //未越界,index后移
					{
						index++;
					}
					else              //越界跳出循环
					{
						break;
					}
					
				} 
				else                 //后序的元音字母可能是 j指向的下一个
				{
					j++;
					if (j == 5) //防止越界  
						break;

					if (word[index] == dict[j]) //和之前的元音字母连起来了是连续的
						continue;
					else
						break;
				}
			}

			if (j == 5) //找到了 美丽字符串进行计算
			{
				int temp = index - i;
				if (temp > Maxret)
					Maxret = temp;

			}

			i = index; //不管是否找到美丽字符串 [ i , index]我们已经证实过了
	
		}
		else //找不到'a'入口,继续找
		{
			i++;
			continue;
		}
	}

	return Maxret;
    }
};

 

比较好的思路:

1.首先如果数组长度小于5的话,不可能满足美丽的定义,将这种情况提前排除
2.遍历时分了几种情况判断:
- 如果当前字符比上一个不小(顺序意义),那么当前子串长度+1
- 如果当前字符比上一个大,那么子串中元音字母种类+1
- 如果当前字符比上一个小,那么肯定当前字串不美丽,以当前字符为首继续进行遍历
3.如果当前子字符串没有以a开头的话,那么在进行下一个子字符串开始遍历之前,元音种类一定不会达到5,所以只要判断种类即可
4.当元音种类为5的时候,持续维护更新最终结果,取出最大值即可


作者:SweetpepperJ
链接:https://leetcode-cn.com/problems/longest-substring-of-all-vowels-in-order/solution/bi-da-xiao-by-sweetpepperj-gdlt/
来源:力扣(LeetCode)
 

class Solution {
public:
    int longestBeautifulSubstring(string word) {
		if (word.size()<5)return 0;
		int res=0;
		int rlen=1;
		int vowel=1;
		for(int i=1;i<word.length();i++)
        {
            if(word[i]>=word[i-1])
              rlen++;

			if(word[i]>word[i-1])    妙呀
              vowel++;

			if(word[i]<word[i-1])
              {
               rlen=1;vowel=1;
              }

			if(vowel==5)
            {
              res=rlen>res?rlen:res;
            }

		}
		return res;
    }
};

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值