發表於 C++CPEUVA兩顆星

【CPE】UVA 10252 Common Permutation 兩顆星 by C++

105 The Skyline Problem

簡易翻譯和條件:

這題雖然是兩顆星但是其實沒有很難~
主要就是在輸入的兩字中找到common characters 並排序輸出
為什麼我會把行這個字特別換紅色呢?

因為我在寫的時候一直拿到error
我才去研究 debug 網站中的公開測資
才發現原來字串也包含空字串阿!!!!!
傻眼XD

主要就是用迴圈找到相同的字串並且換掉換成標點符號(以免之後又被重複算到)
不換成空字串的原因是換空字串的話會影響到字串長度,也會因此跳過後面的字元
找到後就像上一篇提到的一樣利用 algorithm 裡的 sort function 來排列比較方便!

不過我的寫法其實是比較慢的

因為這樣寫就變成Ο(n²)了!

我有在這裡看到一個比較快的想法
主要就是自製一個簡易的map紀錄ascii的方式
最後就利用那個map陣列依序輸出兩邊皆不為0的 ascii 轉 char 的值!!
這樣就會是

Ο(n)

的時間複雜度了!
厲害!!!!

如果有任何問題或是你有更好的寫法歡迎再下面留言討論喔!
我們下一題見啦!

程式碼:

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

string s1="", s2="";
vector‹char› same;

bool compare(char x, char y){
    return x+1 < y+1;
}

int main()
{
    while(getline(cin, s1)&& getline(cin, s2)){

        for(size_t x=0; x<s1.size(); x++){
            for(size_t y=0; y<s2.size(); y++){
                if(s1[x]==s2[y] && s1[x]!='_'){
                    same.push_back(s1[x]);
                    s1.replace(x, 1, "_");
                    s2.replace(y, 1, "_");
                }
            }
        }

        sort(same.begin(), same.end(), compare);

        for(vector<char>::iterator i=same.begin(); i!=same.end(); i++){
            cout << *i;
        }

        cout << endl;
        same.clear();
    }
    return 0;
}

繪圖

作者:

一位 熱愛資工領域、喜歡好笑事物、偶爾打打網球 的學生 ! For A Better Me!

發表留言

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料