1417.重新格式化字符串

This commit is contained in:
游由 2022-08-11 17:48:27 +08:00
parent bf3fadba8e
commit 27ccef7e85
2 changed files with 58 additions and 0 deletions

View File

@ -198,6 +198,7 @@ mod q1403;
mod q1404;
mod q1408;
mod q1413;
mod q1417;
mod q1447;
mod q1473;
mod q1480;

View File

@ -0,0 +1,57 @@
use crate::Solution;
impl Solution {
/// [1417.重新格式化字符串](https://leetcode.cn/problems/reformat-the-string/)
///
/// 2022-08-11 09:28:23
///
/// 给你一个混合了数字和字母的字符串 `s`,其中的字母均为小写英文字母。
///
/// 请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。
///
/// 请你返回 **重新格式化后** 的字符串;如果无法按要求重新格式化,则返回一个 **空字符串** 。
///
/// + **示例 1**
/// + **输入:** s = "a0b1c2"
/// + **输出:** "0a1b2c"
/// + **解释:** "0a1b2c" 中任意两个相邻字符的类型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是满足题目要求的答案。
/// + **示例 2**
/// + **输入:** s = "leetcode"
/// + **输出:** ""
/// + **解释:** "leetcode" 中只有字母,所以无法满足重新格式化的条件。
/// + **示例 3**
/// + **输入:** s = "1229857369"
/// + **输出:** ""
/// + **解释:** "1229857369" 中只有数字,所以无法满足重新格式化的条件。
/// + **示例 4**
/// + **输入:** s = "covid2019"
/// + **输出:** "c2o0v1i9d"
/// + **示例 5**
/// + **输入:** s = "ab123"
/// + **输出:** "1a2b3"
/// + **提示:**
/// * `1 <= s.length <= 500`
/// * `s` 仅由小写英文字母和/或数字组成。
/// + Related Topics
/// * 字符串
pub fn reformat(s: String) -> String {
let (mut p1, mut p2): (Vec<_>, Vec<_>) = s.into_bytes().into_iter().partition(|b| b.is_ascii_digit());
if p1.len() < p2.len() {
std::mem::swap(&mut p1, &mut p2);
}
match p1.len() - p2.len() {
0 | 1 => String::from_utf8((0..p1.len()).map(|i| if i < p2.len() { vec![p1[i], p2[i]] } else { vec![p1[i]] }).flatten().collect::<Vec<u8>>()).unwrap(),
_ => "".to_owned()
}
}
}
#[cfg(test)]
mod test {
use crate::Solution;
#[test]
fn test_q1417() {
println!("{}", Solution::reformat("covid2019".to_owned()));
}
}