給定兩個字串 s 和 t ,編寫乙個函式來判斷 t 是否是 s 的字母異位詞。題解:如果只是26個小寫字母,那麼建立乙個長度為26的陣列記錄每個字母出現的頻次資訊就夠了。如果包含unicode字元,需要使用map來儲存。示例 1:
輸入: s = "anagram", t = "nagaram"
輸出: true
示例 2:
輸入: s = "rat", t = "car"
輸出: false
說明:你可以假設字串只包含小寫字母。
高階:如果輸入字串包含 unicode 字元怎麼辦?你能否調整你的解法來應對這種情況?
classsolution
mapmap = new hashmap<>();
for(int i = 0; i < sarr.length; i++)
for(int i = 0; i < sarr.length; i++)
else
if(map.get(tarr[i]) == 1)
else
}if(map.isempty())
else
}}
給定乙個包含大寫字母和小寫字母的字串,找到通過這些字母構造成的最長的回文串。這個題我的做法是將元素存放雜湊表中,記錄頻次資訊,然後取出所有的values值進行操作。在構造過程中,請注意區分大小寫。比如 "aa" 不能當做乙個回文字串。
注意:假設字串的長度不會超過 1010。
示例 1:
輸入:"abccccdd"
輸出:7
這個題遇到了乙個bug記錄一下:
map.values( ) 返回的是collection型別。collection被定義為介面,需要進行例項化,但是將其強轉成(list)又會報錯。
最後使用的是arraylist的乙個構造方法,arraylist(collection<?
extends
e> 。
classsolution
//collectioncoll = map.values();
//map的values值是以collection的形式返回
list coll = new arraylist(map.values());
iterator iterator =coll.iterator();
int flag = 0; //
記錄回文串是否為奇數的標誌
int sum = 0;
while
(iterator.hasnext())
sum = sum + temp / 2;
}return sum * 2 +flag;
}}
給定兩個字串 s 和 t,判斷它們是否是同構的。如果 s 中的字元可以按某種對映關係替換得到 t ,那麼這兩個字串是同構的。
每個出現的字元都應當對映到另乙個字元,同時不改變字元的順序。不同字元不能對映到同乙個字元上,相同字元只能對映到同乙個字元上,字元可以對映到自己本身。
示例 1:
輸入:s = "egg", t = "add"
輸出:true
classsolution
else
if((map.containskey(sarr[i]) && map.get(sarr[i]) ==tarr[i]))
else
}return
true
; }
}
使用陣列來記錄好像更簡單。
classsolution
preindexofs[sc] = i + 1;
preindexoft[tc] = i + 1;
}return
true;}
}
給定乙個字串,你的任務是計算這個字串中有多少個回文子串。感覺思路是一致的,我的**四十多行,大佬的**就十幾行,我/(ㄒoㄒ)/~~具有不同開始位置或結束位置的子串,即使是由相同的字元組成,也會被視作不同的子串。
示例 1:
輸入:"abc"
輸出:3
解釋:三個回文子串: "a", "b", "c"
classsolution
return
sum;
}//以i為中心的回文子串的個數
public
int sum1(int i, char
arr)
else
k++;
}return
sum;
}//以i + 0.5為中心的回文子串的個數
public
int sum2(int i, char
arr)
else
k++;
}return
sum ;
}}
classsolution
return
cnt;
}private
void extendsubstrings(string s, int start, int
end)
}}
判斷乙個整數是否是回文數。回文數是指正序(從左向右)和倒序(從右向左)讀都是一樣的整數。使用字串確實簡單。你能不將整數轉為字串來解決這個問題嗎?
classsolution
}return
true
; }
}
·不使用字串,更多的使用數學的方式。不停地使用餘數成十以致兩個數長度差在1以內。
classsolution
if (x < 0 || x % 10 == 0)
int right = 0;
while (x >right)
return x == right || x == right / 10;
}}
給定乙個字串 s,計算具有相同數量0和1的非空(連續)子字串的數量,並且這些子字串中的所有0和所有1都是組合在一起的。重複出現的子串要計算它們出現的次數。
示例 1 :
輸入: "00110011"
輸出: 6
解釋: 有6個子串具有相同數量的連續1和0:「0011」,「01」,「1100」,「10」,「0011」 和 「01」。
請注意,一些重複出現的子串要計算它們出現的次數。
另外,「00110011」不是有效的子串,因為所有的0(和1)沒有組合在一起。
這個題不容易,忙碌了幾個小時的菜鳥程式設計師發現執行時間超出限制。
寫程式確實需要腦袋清醒,之前的思路正確但是巢狀迴圈太浪費執行時間。換換思路還是事半功倍。
classsolution
int k = 1;
while(i - k + 1 >= 0 && i + k else
}}
return
sum;
}}
貼乙個大佬的做法,演算法確實妙。
classsolution
else
if (prelen >=curlen)
}return
count;
}}
leetcode刷題 字串 反轉字串
給定乙個字串 s 和乙個整數 k,你需要對從字串開頭算起的每隔 2k 個字元的前 k 個字元進行反轉。如果剩餘字元少於 k 個,則將剩餘字元全部反轉。如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。示例 輸入 s abcdefg k 2 輸出 bacdfeg 該...
LeetCode刷題 字串陣列之間轉換
給你乙個僅由數字 6 和 9 組成的正整數 num。你最多只能翻轉一位數字,將 6 變成 9,或者把 9 變成 6 請返回你可以得到的最大數字。示例 1 輸入 num 9669 輸出 9969 解釋 改變第一位數字可以得到 6669 改變第二位數字可以得到 9969 改變第三位數字可以得到 9699...
刷題 字串 加入數字
題面 有乙個長度不超過20位的整數 以字串的形式給出 同時給出乙個加入數字p,p可加入在整數的任何位置。加入之 後,再刪去乙個數字,使剩下來的數最大。例如 有整數 1 2 3 4 5 6 7 8,p 為 5 得到的結果 5 2 3 4 5 6 7 8 說明 1 2 3 4 5 6 7 8 加入5之後...