ide 를 사용하지 않고 문제를 풀어보기로
leetcode 의 경우 include 에 대해 명시하지 않아도 사전에 include 되어 있는 라이브러리들이 대다수
125. Valid Palindrome
class Solution {
public:
bool isalnu(const char& c){
if(c >='a' && c<='z'){
return true;
} else if(c >='A' && c<='Z'){
return true;
} else if(c >='0' && c<='9'){
return true;
}
return false;
}
bool lowerCMP(const char& c, const char& c2){
if(c >='A' && c <='Z' && c2 >='a' && c2 <='z'){
return c+32 == c2;
} else if(c2 >='A' && c2 <='Z' && c >='a' && c <='z'){
return c == c2+32;
}
return c == c2;
}
bool isPalindrome(string s) {
size_t ri = s.length()-1;
size_t i = 0;
while(i < ri){
char& left = s[i];
char& right = s[ri];
if(isalnu(left) == false){
i++;
continue;
}
if(isalnu(right) == false){
ri--;
continue;
}
if(lowerCMP(left,right)){
++i;
--ri;
continue;
} else{
return false;
}
}
return true;
}
};344. Reverse String
class Solution {
public:
void reverseString(vector<char>& s) {
if(s.size()==0){
return;
}
size_t i = 0;
size_t ri = s.size()-1;
while(i < ri){
auto temp = std::move(s[i]);
s[i] = std::move(s[ri]);
s[ri] = std::move(temp);
++i;
--ri;
}
}
};937. Reorder Data in Log Files
https://leetcode.com/problems/most-common-word/
819. Most Common Word테스트케이스 단어의 구분자가 ‘ ‘ 공백 ‘,’ 콤마로 복합적인데 그걸 간과하고 stringstram getlin 으로 tokenize 하려고 하다가 코드가 꼬였다 실제는 단어보다 char 단위로 완전 탐색하며 단어를 구분짓고 hashtable 처리해야 할듯
추가로 map 에 대한 for access 시 신규 기능인 structured binding 을 사용하면 좀더 깔끔할듯
완전 탐색으로 alphanumeric 이 아닌 경우를 단어구분 조건으로 잡았으나 단일 단어 입력 시 해당조건을 사용할 수 없으며 alphanumeric 이 아닌 경우의 케이스에 무조건 hashtable 에 해당 cur string 이 연산되는 현ㅅ상을 예외처리함 좋지않다..
#include <unordered_map>
class Solution {
public:
bool isalnu(const char& c){
if(c >='a' && c<='z'){
return true;
} else if(c >='A' && c<='Z'){
return true;
} else if(c >='0' && c<='9'){
return true;
}
return false;
}
string mostCommonWord(string paragraph, vector<string>& banned) {
unordered_map<string,int> wordCnt;
paragraph+=" ";
string cur;
for(auto& c : paragraph){
if(isalnu(c)){
cur += tolower(c);
} else if(cur!="") {
wordCnt[cur]++;
cur="";
}
}
for(auto x : banned){
wordCnt[x] = 0;
}
int mostC = 0;
string retMost = "";
for(auto [first, second] : wordCnt){
if(mostC < second){
retMost = first;
mostC = second;
}
}
return retMost;
}
};https://leetcode.com/problems/group-anagrams/
49. Group Anagrams
(sort 이외에 alpha count 를 이용한 hash 값을 직접 구하면 좀더 빠르다)
#include <unordered_map>
class Solution {
public:
vector<vector<string>> groupAnagrams(vector<string>& strs) {
vector<vector<string>> ret;
unordered_map<string,vector<string>> hTable;
for(auto&& cur : strs){
auto sCur = cur;
sort(sCur.begin(), sCur.end());
hTable[sCur].push_back(move(cur));
}
for(auto&& cur : hTable){
ret.emplace_back(move(cur.second));
}
return ret;
}
};https://leetcode.com/problems/longest-palindromic-substring/
5. Longest Palindromic Substring
242. Valid Anagram
class Solution {
public:
bool isAnagram(string s, string t) {
array<int,'z'-'a'+1> alphas={0,};
for(auto&& c : s){
++alphas[c-'a'];
}
for(auto&& c : t){
--alphas[c-'a'];
}
for(auto&& c : alphas){
if(c!=0)
return false;
}
return true;
}
};https://leetcode.com/problems/rotate-string/
796. Rotate String
변칙적인 방법.. 한 단어의 순환은 결국 A+A 로 표현가능
class Solution {
public:
bool rotateString(string A, string B) {
if(A.length() == B.length()){
A = A+A;
if(A.find(B) != std::string::npos){
return true;
}
}
return false;
}
};
댓글 남기기