2. LeetCode 5409. 檢查一個字符串是否包含所有長度為 K 的二進制子串 medium
題目鏈接 給你一個二進制字符串 s 和一個整數 k 。
如果所有長度為 k 的二進制字符串都是 s 的子串,請返回 True ,否則請返回 False 。
示例 1:
輸入:s ="00110110", k =2
輸出:true
解釋:長度為 2 的二進制串包括 "00","01","10" 和 "11"。
它們分別是 s 中下標為 0,1,3,2 開始的長度為 2 的子串。示例 2:
輸入:s ="00110", k =2
輸出:true示例 3:
輸入:s ="0110", k =1
輸出:true
解釋:長度為 1 的二進制串包括 "0" 和 "1",顯然它們都是 s 的子串。示例 4:
輸入:s ="0110", k =2
輸出:false
解釋:長度為 2 的二進制串 "00" 沒有出現在 s 中。示例 5:
輸入:s ="0000000001011100", k =4
輸出:false提示:
1<= s.length <=5*10^5
s 中只含 0 和 1 。
1<= k <=20
解題:
大小為k的滑動窗口,把字符串取出來,轉成int放入集合,看集合中數的種類是不是 2k 個
classSolution{public:boolhasAllCodes(string s,int k){if(s.size()<= k)returnfalse;int i, l =0, r =0, num;set<int> st;for(; r < s.size();++r){if(r-l+1== k)//長度為 k {num =0;for(i = l; i <= r;++i)//轉成數字num = s[i]-'0'+(num<<1);st.insert(num);l++;}}return st.size()==(1<<k);}};
將字符串從給定下標開始的字符子串,從base進制 轉成 10 進制intint stoi (const string& str, size_t* idx =0,int base =10);int stoi (const wstring& str, size_t* idx =0,int base =10);classSolution{public:boolhasAllCodes(string s,int k){if(s.size()<= k)returnfalse;int i, l =0, r =0;set<int> st;string str;for(; r < s.size();++r){if(r-l+1== k){str = s.substr(l,k);st.insert(stoi(str,0,2));l++;}}return st.size()==(1<<k);}};
For each cell (i, j) in M:if i == j:M[i][j]=0if(i, j) is an edge in E:M[i][j]=weight(i, j)else:M[i][j]= infinity
for k from 1 to |V|:for i from 1 to |V|:for j from 1 to |V|:if M[i][j]> M[i][k]+ M[k][j]:M[i][j]= M[i][k]+ M[k][j]classSolution{public:vector<bool>checkIfPrerequisite(int n, vector<vector<int>>& prerequisites, vector<vector<int>>& queries){vector<vector<bool>>m(n, vector<bool>(n,false));for(auto& pre : prerequisites)m[pre[0]][pre[1]]=true;int i, j, k;for(i =0; i < n;++i){for(j =0; j < n;++j){for(k =0; k < n;++k){if(m[j][i]&& m[i][k])//連通判斷m[j][k]=true;}}}vector<bool>ans(queries.size());i =0;for(auto& q : queries)ans[i++]= m[q[0]][q[1]];return ans;}};
1068 ms 59.5 MB
4. LeetCode 5411. 摘櫻桃 II hard
題目鏈接 給你一個 rows x cols 的矩陣 grid 來表示一塊櫻桃地。 grid 中每個格子的數字表示你能獲得的櫻桃數目。