去除重復(fù)字母問(wèn)題

給你一個(gè)僅包含小寫(xiě)字母的字符串盆偿,請(qǐng)你去除字符串中重復(fù)的字母听哭,使得每個(gè)字母只出現(xiàn)一次。需保證返回結(jié)果的字典序最小(要求不能打亂其他字符的相對(duì)位置)

示例1:
input:"bcabc"
output:"abc"

示例2:
輸入:"cbacdcbc"
輸出:"acdb"

概念

一骤星、字典序

字典序,就是按照字典中出現(xiàn)的先后順序進(jìn)行排序爆哑。

1洞难、單個(gè)字符

在計(jì)算機(jī)中,字母以及數(shù)字字符揭朝,字典排序如下:
'0' < '1' < '2' < ... < '9' < 'a' < 'b' < ... < 'z'

2队贱、多個(gè)字符

這是單個(gè)字符的大小情況,那么如果是兩個(gè)字符串比較大小呢潭袱?在計(jì)算機(jī)中柱嫌,兩個(gè)字符串比較大小,是按照從左到右的順序進(jìn)行比較屯换,如果第1位相等编丘,就比較第2位与学,直至有一位可以比較出大小來(lái),則不再繼續(xù)比較嘉抓。

使用計(jì)算機(jī)屬于來(lái)描述:

對(duì)于任意兩個(gè)序列 (a,b) 和 (a’,b’)索守,字典序定義為: (a,b) ≤ (a′,b′) 當(dāng)且僅當(dāng) a < a′ 或 (a = a′ 且 b ≤ b′).

3、全排列的字典序

給定多個(gè)字符抑片,可以按照任意順序進(jìn)行排列卵佛,所有排列稱為全排列。每一種排列對(duì)應(yīng)一個(gè)字符串敞斋,如果這些字符串按照字符串大小的順序進(jìn)行排序截汪,那么就這種排序是基于字典序的全排列。

比如給定三個(gè)字符 a,b,c渺尘,則他們基于字典序的全排列為:
abc > acb > bac > bca > cab > cba

解題

注意點(diǎn)

字典序要最小挫鸽,并且不能更改相對(duì)位置,字母互換

思路

  1. 字符串S為空鸥跟,長(zhǎng)度為1丢郊,不需要處理
  2. 使用一個(gè)數(shù)組記錄每個(gè)字母出現(xiàn)次數(shù) record [26]
  3. 字符串棧stack,用來(lái)去除重復(fù)字母的結(jié)果医咨,并且找到正確最小的字典序
  4. 遍歷字符串
  5. 從0~top,遍歷stack 判斷當(dāng)前字符s[i]是否存在于棧stack中如果當(dāng)前字符是否存在于棧的定義一個(gè)falg 標(biāo)記isExist, 0表示不存在, 1表示存在
  6. 如果isExist存在,record[s[i]]位置上的出現(xiàn)次數(shù)減一枫匾,并繼續(xù)遍歷下一個(gè)字符; 表示當(dāng)前的stack已經(jīng)有這個(gè)字符了沒(méi)有必要處理這個(gè)重復(fù)的字母
  7. 如果isExist不存在,則
    • 如果不存在,則需要循環(huán)一個(gè)找到一個(gè)正確的位置,然后在存儲(chǔ)起來(lái);
    • 如果不存在,跳過(guò)棧中所有比當(dāng)前字符大拟淮、且后面還會(huì)出現(xiàn)的元素干茉,然后將當(dāng)前字符入棧
    • top > -1表示棧非空
    • stack[top] > s[i]表示棧頂元素比當(dāng)前元素大
    • record[stack[top]] > 1表示后面還會(huì)出現(xiàn)
      通過(guò)一個(gè)while循環(huán)找到將棧中位置錯(cuò)誤的數(shù)據(jù),出棧. 找當(dāng)前合適的位置,則結(jié)束while循環(huán);找到合理的位置后,則將當(dāng)前字符s[i]入棧
  8. 遍歷完成后,在stack 后添加'\0',返回當(dāng)前字符串首地址

代碼

char *removeCharacter(char *string) {
    // 1很泊、特殊情況 s為空角虫,長(zhǎng)度為0
    //2、s長(zhǎng)度為1
    if (string == NULL || strlen(string) == 0 ) {
        return "";
    }
    if (strlen(string) == 1) {
        return string;
    }
    char record[26] = {0};
    // 字符串長(zhǎng)度
    int len = (int)strlen(string);
    // 存儲(chǔ)不用字符
    char *stack = (char *)malloc(len * 2 *sizeof(char));
    memset(stack, 0, len * 2 *sizeof(char));
    int top = -1;
    
    // 統(tǒng)計(jì)每個(gè)字母出現(xiàn)次數(shù)
    // string[i] - 'a' 利用asc碼得道每個(gè)字母的位置委造,記錄到record中
    int i = 0;
    for (i = 0; i < len; i++) {
        record[string[i] - 'a']++;
    }
    
    // 遍歷字符串s戳鹅,把不相同的字母進(jìn)棧
    for (i = 0; i < len; i++) {
        int isExist = 0;
        // 判斷當(dāng)前字符在棧里面是否存在
        for (int j = 0; j <= top; j++) {
            if (string[i] == stack[j]) {
                isExist = 1;
                break;
            }
        }
        
        if (isExist == 1) {
            record[string[i] - 'a']--;
        } else {
            while (top > -1 && stack[top] > string[i] && record[stack[top] - 'a'] > 1) {
                record[stack[top] - 'a']--;
                top--;
            }
            top++;
            stack[top] = string[i];
        }
    }
    stack[++top] = '\0';
    return stack;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市昏兆,隨后出現(xiàn)的幾起案子枫虏,更是在濱河造成了極大的恐慌,老刑警劉巖爬虱,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件隶债,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡跑筝,警方通過(guò)查閱死者的電腦和手機(jī)死讹,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)曲梗,“玉大人赞警,你說(shuō)我怎么就攤上這事逛腿。” “怎么了仅颇?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵单默,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我忘瓦,道長(zhǎng)搁廓,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任耕皮,我火速辦了婚禮境蜕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘凌停。我一直安慰自己粱年,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布罚拟。 她就那樣靜靜地躺著台诗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赐俗。 梳的紋絲不亂的頭發(fā)上拉队,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音阻逮,去河邊找鬼粱快。 笑死,一個(gè)胖子當(dāng)著我的面吹牛叔扼,可吹牛的內(nèi)容都是我干的事哭。 我是一名探鬼主播,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼瓜富,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鳍咱!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起食呻,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤流炕,失蹤者是張志新(化名)和其女友劉穎澎现,沒(méi)想到半個(gè)月后仅胞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡剑辫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年干旧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片妹蔽。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡椎眯,死狀恐怖挠将,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情编整,我是刑警寧澤舔稀,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站掌测,受9級(jí)特大地震影響内贮,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜汞斧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一夜郁、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧粘勒,春花似錦竞端、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至乘陪,卻和暖如春赵颅,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背暂刘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工饺谬, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谣拣。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓募寨,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親森缠。 傳聞我的和親對(duì)象是個(gè)殘疾皇子拔鹰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345