C?C++?題解LeetCode1417重新格式化字符串
題目描述
題目鏈接:1417. 重新格式化字符串
給你一個(gè)混合了數(shù)字和字母的字符串 s,其中的字母均為小寫英文字母。
請(qǐng)你將該字符串重新格式化,使得任意兩個(gè)相鄰字符的類型都不同。也就是說,字母后面應(yīng)該跟著數(shù)字,而數(shù)字后面應(yīng)該跟著字母。
請(qǐng)你返回 重新格式化后 的字符串;如果無法按要求重新格式化,則返回一個(gè) 空字符串 。
提示:
- 1?s.length?5001
s僅由小寫英文字母和/或數(shù)字組成。
示例 1:
輸入:s = "a0b1c2"
輸出:"0a1b2c"
解釋:"0a1b2c" 中任意兩個(gè)相鄰字符的類型都不同。 "a0b1c2", "0a1b2c", "0c2a1b" 也是滿足題目要求的答案。
示例 2:
輸入: s = "leetcode"
輸出: ""
解釋: "leetcode" 中只有字母,所以無法滿足重新格式化的條件。
示例 3:
輸入: s = "1229857369"
輸出: ""
解釋: "1229857369" 中只有數(shù)字,所以無法滿足重新格式化的條件。
示例 4:
輸入: s = "covid2019"
輸出: "c2o0v1i9d"
示例 5:
輸入: s = "ab123"
輸出: "1a2b3"
整理題意
題目給定一個(gè)字符串,僅包含小寫字母和數(shù)字,讓我們利用字符串中所給的這些字符構(gòu)造一個(gè)字符串,使得構(gòu)造出來的字符串中字母字符和數(shù)字字符不相鄰。答案返回任意一個(gè)滿足條件的字符串即可,如果無法構(gòu)造這樣的字符串返回空字符串。
解題思路分析
根據(jù)題目描述可知,為了使得字符串中不含有相鄰的字母和數(shù)字,我們盡可能的使得字母和數(shù)字交叉排列,那么當(dāng)字符串中數(shù)字個(gè)數(shù)和字母?jìng)€(gè)數(shù)的差值大于 1 時(shí),無論我們?cè)趺磁帕锌倳?huì)有兩個(gè)相同的字母字符或數(shù)字字符相鄰。
那么考慮當(dāng)字符串中數(shù)字個(gè)數(shù)和字母?jìng)€(gè)數(shù)的差值小于等于 1 時(shí),我們將個(gè)數(shù)較多的種類字符放在偶數(shù)位置上,較少的字符種類放在奇數(shù)位置上(位置從 0 開始)。
具體實(shí)現(xiàn)
首先統(tǒng)計(jì)字符串中數(shù)字字符個(gè)數(shù)和字母字符個(gè)數(shù),并判斷兩者差值是否大于 1,大于 1 的情況直接返回空字符串。
雙指針 實(shí)現(xiàn)字符串排列:
- 指針
i指向偶數(shù)位置,j指向奇數(shù)位置; - 初始化
i = 0,j = 1; - 當(dāng)
i位置上的字符不為較多的字符種類時(shí),利用j指針從左到右找到第一個(gè)較多的字符種類,與位置i進(jìn)行交換字符; - 重復(fù)步驟
3直至遍歷完整個(gè)字符串。
細(xì)節(jié)操作:代碼實(shí)現(xiàn)過程中僅用 if(isdigit(s[i]) != f) 這樣的判斷語句涵括了兩種情況的判斷。
復(fù)雜度分析
- 時(shí)間復(fù)雜度:O(n),其中
n為字符串s的長(zhǎng)度,需要遍歷兩遍字符串。 - 空間復(fù)雜度:O(1),僅使用常量空間。
代碼實(shí)現(xiàn)
class Solution {
public:
string reformat(string s) {
// 統(tǒng)計(jì)數(shù)字和字母的個(gè)數(shù)
int sum_digit = 0, sum_alpha = 0;
for(auto &c : s){
if(isdigit(c)) sum_digit++;
else sum_alpha++;
}
// 當(dāng)個(gè)數(shù)差大于 1 時(shí)無法構(gòu)造
if(abs(sum_digit - sum_alpha) > 1) return "";
bool f = sum_digit > sum_alpha;
int n = s.size();
for(int i = 0, j = 1; i < n; i += 2){
// 注意判斷語句的難點(diǎn),和 f 有關(guān)
if(isdigit(s[i]) != f){
while(isdigit(s[j]) != f) j += 2;
swap(s[i], s[j]);
}
}
return s;
}
};
總結(jié)
- 該題為簡(jiǎn)單的字符串題目,需要注意的是代碼實(shí)現(xiàn)過程中的判斷語句部分,
isdigit(s[i]) != f這樣一句判斷語句即可涵括兩種情況的判斷,且判斷語句需要根據(jù)f的定義來寫。 - 另外就是雙指針的思想,巧妙利用雙指針實(shí)現(xiàn)字符串的原地構(gòu)造。
- 測(cè)試結(jié)果:

以上就是C C++ 題解LeetCode1417重新格式化字符串的詳細(xì)內(nèi)容,更多關(guān)于C C++ 重新格式化字符串的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(188.買賣股票的最佳時(shí)間之四),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08
Matlab實(shí)現(xiàn)數(shù)據(jù)的動(dòng)態(tài)顯示方法
這篇文章主要為大家詳細(xì)介紹了Matlab使用Plot函數(shù)實(shí)現(xiàn)數(shù)據(jù)動(dòng)態(tài)顯示方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-06-06
C語言用遞歸函數(shù)對(duì)素?cái)?shù)進(jìn)行判斷流程
素?cái)?shù)判斷是編程語言學(xué)習(xí)過程中一個(gè)老生常談的話題,而它的實(shí)現(xiàn)也有多種算法,包括經(jīng)典的試除法(以及試除法的幾種優(yōu)化),進(jìn)階的素?cái)?shù)表篩選法,埃拉托斯特尼篩法和歐拉篩法(以及它們的優(yōu)化)等。對(duì)以上算法感興趣的朋友們,不妨搜索“素?cái)?shù)判斷的N種境界”來學(xué)習(xí)了解2022-09-09
基于C語言實(shí)現(xiàn)隨機(jī)點(diǎn)名器(附源碼)
這篇文章主要為大家詳細(xì)介紹如何基于C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的隨機(jī)點(diǎn)名器,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起動(dòng)手嘗試一下2022-07-07
Qt實(shí)現(xiàn)SqlRelationalTable關(guān)聯(lián)表組件
在Qt中我們可以通過拖拽的方式將不同組件放到指定的位置,實(shí)現(xiàn)圖形化開發(fā)極大的方便了開發(fā)效率,本章將重點(diǎn)介紹SqlRelationalTable關(guān)聯(lián)表組件的常用方法及靈活運(yùn)用,感興趣的可以了解一下2023-12-12
strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命分享
這篇文章主要介紹了strcpy函數(shù)實(shí)現(xiàn)簡(jiǎn)示例命,需要的朋友可以參考下2014-03-03

