返回介绍

solution / 2700-2799 / 2785.Sort Vowels in a String / README

发布于 2024-06-17 01:03:00 字数 4952 浏览 0 评论 0 收藏 0

2785. 将字符串中的元音字母排序

English Version

题目描述

给你一个下标从 0 开始的字符串 s ,将 s 中的元素重新 排列 得到新的字符串 t ,它满足:

  • 所有辅音字母都在原来的位置上。更正式的,如果满足 0 <= i < s.length 的下标 i 处的 s[i] 是个辅音字母,那么 t[i] = s[i] 。
  • 元音字母都必须以他们的 ASCII 值按 非递减 顺序排列。更正式的,对于满足 0 <= i < j < s.length 的下标 i 和 j  ,如果 s[i] 和 s[j] 都是元音字母,那么 t[i] 的 ASCII 值不能大于 t[j] 的 ASCII 值。

请你返回结果字母串。

元音字母为 'a' ,'e' ,'i' ,'o' 和 'u' ,它们可能是小写字母也可能是大写字母,辅音字母是除了这 5 个字母以外的所有字母。

 

示例 1:

输入:s = "lEetcOde"
输出:"lEOtcede"
解释:'E' ,'O' 和 'e' 是 s 中的元音字母,'l' ,'t' ,'c' 和 'd' 是所有的辅音。将元音字母按照 ASCII 值排序,辅音字母留在原地。

示例 2:

输入:s = "lYmpH"
输出:"lYmpH"
解释:s 中没有元音字母(s 中都为辅音字母),所以我们返回 "lYmpH" 。

 

提示:

  • 1 <= s.length <= 105
  • s 只包含英语字母表中的 大写 小写 字母。

解法

方法一:排序

我们先将字符串中的所有元音字母存到数组或列表 $vs$ 中,然后我们对 $vs$ 进行排序。

接下来,我们遍历字符串 $s$,保持辅音字母不变,如果是元音字母,则依次按顺序替换为 $vs$ 数组中的字母。

时间复杂度 $O(n \times \log n)$,空间复杂度 $O(n)$。其中 $n$ 是字符串 $s$ 的长度。

class Solution:
  def sortVowels(self, s: str) -> str:
    vs = [c for c in s if c.lower() in "aeiou"]
    vs.sort()
    cs = list(s)
    j = 0
    for i, c in enumerate(cs):
      if c.lower() in "aeiou":
        cs[i] = vs[j]
        j += 1
    return "".join(cs)
class Solution {
  public String sortVowels(String s) {
    List<Character> vs = new ArrayList<>();
    char[] cs = s.toCharArray();
    for (char c : cs) {
      char d = Character.toLowerCase(c);
      if (d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u') {
        vs.add(c);
      }
    }
    Collections.sort(vs);
    for (int i = 0, j = 0; i < cs.length; ++i) {
      char d = Character.toLowerCase(cs[i]);
      if (d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u') {
        cs[i] = vs.get(j++);
      }
    }
    return String.valueOf(cs);
  }
}
class Solution {
public:
  string sortVowels(string s) {
    string vs;
    for (auto c : s) {
      char d = tolower(c);
      if (d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u') {
        vs.push_back(c);
      }
    }
    sort(vs.begin(), vs.end());
    for (int i = 0, j = 0; i < s.size(); ++i) {
      char d = tolower(s[i]);
      if (d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u') {
        s[i] = vs[j++];
      }
    }
    return s;
  }
};
func sortVowels(s string) string {
  cs := []byte(s)
  vs := []byte{}
  for _, c := range cs {
    d := c | 32
    if d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u' {
      vs = append(vs, c)
    }
  }
  sort.Slice(vs, func(i, j int) bool { return vs[i] < vs[j] })
  j := 0
  for i, c := range cs {
    d := c | 32
    if d == 'a' || d == 'e' || d == 'i' || d == 'o' || d == 'u' {
      cs[i] = vs[j]
      j++
    }
  }
  return string(cs)
}
function sortVowels(s: string): string {
  const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'];
  const vs = s
    .split('')
    .filter(c => vowels.includes(c))
    .sort();
  const ans: string[] = [];
  let j = 0;
  for (const c of s) {
    ans.push(vowels.includes(c) ? vs[j++] : c);
  }
  return ans.join('');
}
public class Solution {
  public string SortVowels(string s) {
    List<char> vs = new List<char>();
    char[] cs = s.ToCharArray();
    foreach (char c in cs) {
      if (IsVowel(c)) {
        vs.Add(c);
      }
    }
    vs.Sort();
    for (int i = 0, j = 0; i < cs.Length; ++i) {
      if (IsVowel(cs[i])) {
        cs[i] = vs[j++];
      }
    }
    return new string(cs);
  }

  public bool IsVowel(char c) {
    c = char.ToLower(c);
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文