小红的元音距离

小红的元音距离

https://www.nowcoder.com/practice/65409356ae9a43668ac23fb14c78372d

小红的元音距离

[题目链接](https://www.nowcoder.com/practice/65409356ae9a43668ac23fb14c78372d)

思路

题目定义字符串的"权值"为最远两个元音字母之间的距离。如果元音数量不超过 1,权值为 0。要求删除一些字母,使剩余字符串的权值尽可能大,问最多能删除多少个字母。

关键观察

在剩余字符串中,权值 = 最后一个元音的位置 - 第一个元音的位置(位置是在剩余字符串中的下标)。删除一个处于首尾元音之间的字符,会让剩余字符串变短,权值减少 1。因此,首尾元音之间的字符不能删

而首个元音之前、末尾元音之后的字符,对权值没有正面贡献——删掉它们不会改变首尾元音之间的距离(反而删掉前面的会让首元音位置前移,但不影响两元音之间的字符数)。实际上删掉这些字符后,权值保持不变(首尾元音间的字符数不变),因此应该全部删掉。

分情况讨论

设原字符串长度为 ,第一个元音位置为 ,最后一个元音位置为 (0-indexed)。

  • 元音数量 :无论怎么保留,权值最大为 0。空串权值也是 0,直接删掉全部字符,答案为
  • 元音数量 :保留 区间内的所有字符,删掉区间外的。答案为

复杂度分析

  • 时间复杂度:,遍历一次字符串找首尾元音。
  • 空间复杂度:,存储输入字符串。

代码

[sol-C++]

#include <bits/stdc++.h>
using namespace std;
int main(){
    string s;
    cin >> s;
    int n = s.size();
    auto isVowel = [](char c){ return c=='a'||c=='e'||c=='i'||c=='o'||c=='u'; };
    int first = -1, last = -1;
    for(int i = 0; i < n; i++){
        if(isVowel(s[i])){
            if(first == -1) first = i;
            last = i;
        }
    }
    if(first == -1 || first == last){
        cout << n << endl;
    } else {
        cout << first + (n - 1 - last) << endl;
    }
    return 0;
}

[sol-Java]

import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int n = s.length();
        int first = -1, last = -1;
        for (int i = 0; i < n; i++) {
            char c = s.charAt(i);
            if (c=='a'||c=='e'||c=='i'||c=='o'||c=='u') {
                if (first == -1) first = i;
                last = i;
            }
        }
        if (first == -1 || first == last) {
            System.out.println(n);
        } else {
            System.out.println(first + (n - 1 - last));
        }
    }
}

[sol-Python3]

s = input()
n = len(s)
vowels = set('aeiou')
first = -1
last = -1
for i in range(n):
    if s[i] in vowels:
        if first == -1:
            first = i
        last = i
if first == -1 or first == last:
    print(n)
else:
    print(first + (n - 1 - last))

[sol-JavaScript]

const readline = require('readline');
const rl = readline.createInterface({ input: process.stdin });
rl.on('line', (line) => {
    const s = line.trim();
    const n = s.length;
    const vowels = new Set(['a','e','i','o','u']);
    let first = -1, last = -1;
    for (let i = 0; i < n; i++) {
        if (vowels.has(s[i])) {
            if (first === -1) first = i;
            last = i;
        }
    }
    if (first === -1 || first === last) {
        console.log(n);
    } else {
        console.log(first + (n - 1 - last));
    }
    rl.close();
});
全部评论

相关推荐

不知道怎么取名字_:现在找工作是真的太不容易了
点赞 评论 收藏
分享
今天 13:03
已编辑
长沙学院 Java
个人背景:学院二本计科专业&nbsp;大二开始实习个人经历:安克创新&nbsp;、理想汽车、字节跳动碎碎念:我做事只有三分钟热度。看到进了大厂的同学,我会羡慕,也会跟着努力上进;但遇到好看的小说,我又会放下手头的事沉迷其中,之前的坚持也就中断了。我有些自卑,总觉得自己学历和外貌都不够好。之前偶然在网上受到关注,我就喜欢上了上网,因为这里有很多人认可我。但我也很在意别人的评价,偶尔看到嘲讽的言论,会触发我的自卑情绪,让我感到愤怒。有时候我会强硬地回怼,有时候又会懦弱地选择无视。我也有虚荣心。不管是拿到安克、理想还是字节的机会,我在分享的时候都会带着这份心思。我会特意强调自己学历不好,是为了衬托出过程的艰难,以此显得自己更厉害。我知道,人往往会炫耀自己缺少的东西,来掩盖内心的空洞。我总想着走捷径,不太喜欢踏踏实实地做事。找实习的时候,我花了更多时间在研究面试技巧上,而不是提升专业能力。我会反复听面试录音分析技巧,看面试教程学习怎么和不同的面试官沟通,还会每天自言自语练习语言表达,同学都觉得我有点奇怪。我的实习生涯里,侥幸和运气占了很大一部分。我总在想,如果有一天我失去了这份幸运,这些特质可能会让我一蹶不振。ps:&nbsp;很多人会问我学习路线和经验&nbsp;但是就像我上面说的&nbsp;我的实习过程靠的很多是关键节点的运气&nbsp;技术上面我可能不如很多人&nbsp;&nbsp;所以请大家理性求助和理性参考我的回答&nbsp;附上我的投递记录
我的求职进度条
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务