---
# System prepended metadata

title: 1839. Longest Substring Of All Vowels in Order
tags: [Leetcode, Sliding Window, Medium]

---

# 1839. Longest Substring Of All Vowels in Order
###### tags: `Leetcode` `Medium` `Sliding Window`
Link: https://leetcode.com/problems/longest-substring-of-all-vowels-in-order/
## 思路 $O(N)$ $O(1)$
### 思路一 
非常直觉的做法，但是需要考虑的情况有点多
用回圈检查，
- 如果这个字母是正确的，把后面所有重复的都用while回圈扫过一遍，下一次再进for loop的时候就检查元音表里的下一个元音
- 如果这个字母是不正确的，例如aeu, aeia, 就说明之前的要作废啦，如果这个错的字母是a，就说明要重新计数，所以让下一次进入for回圈的i还是指向a，因此需要i--，并且把len设为0，(这里不论错的字母是不是a都要设)
- 如果元音表已经检查完了，也就是```vIdx==vowels.length```，就说明现在的长度是valid，可以进行比较
### 思路二
参考[这里](https://leetcode.com/problems/longest-substring-of-all-vowels-in-order/discuss/1175189/Best-C%2B%2B-Solution)
Given word only contains vowels(given in question) and we just have to find out the longest substring that contains all vowels in sorted order of ascii value. i.e 'a'<'e'<'i'<'o'<'u' .
So if a substring have 5 unique character and following ascii order we can update our answer by its length.
## Code
### 思路一
```java=
class Solution {
    public int longestBeautifulSubstring(String word) {
        int len = 0;
        int maxLen = 0;
        char[] vowels = new char[]{'a','e','i','o','u'};
        int vIdx = 0;
        for(int i = 0;i < word.length();i++){
            if(word.charAt(i)==vowels[vIdx]){
                while(i < word.length() && word.charAt(i)==vowels[vIdx]){
                    i++;
                    len++;
                }
                i--;
                vIdx++;
            }
            // start check from beginning vowel
            else{
                vIdx = 0;
                if(word.charAt(i)==vowels[0]) i--;
                len = 0;
            }
            if(vIdx == vowels.length){
                maxLen = Math.max(len, maxLen);
                vIdx = 0;
                len = 0;
            }
            
            
        }
        return maxLen;
    }
}
```
### 思路二
```java=
 public int longestBeautifulSubstring(String word) {
        int cnt=1, len=1, max_length=0;
        int n=word.length();
        
        for(int i=1;i<n;i++){
            if(word.charAt(i)==word.charAt(i-1)){
                 len++;
            }else if(word.charAt(i-1)<word.charAt(i)){
                cnt++;
                len++;
            }else{
                len=1;
                cnt=1;
            }
            
            if(cnt==5){
                max_length=Math.max(max_length,len);
            }
        }
        return max_length;
    }
```