1.[编程题]长度为 K 的重复字符子串
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
给你一个由小写字母组成的长度为n的字符串 S ,找出所有长度为 k 且包含重复字符的子串,请你返回全部满足要求的子串的数目。
数据范围: 2<k<400 , 5<n<900
进阶: 时间复杂度O(n),空间复杂度O(n)
输入例子1:
“createfunonyoka”,4
输出例子1:
4
输入例子2:
“yokagames”,3
输出例子2:
1
输入例子3:
“yoka”,4
输出例子3:
0
代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param s string字符串
* @param k int整型
* @return int整型
*/
int numKLenSubstrRepeats(string s, int k) {
// write code here
int left = 0,right = k-1;
int ans = 0;
int n = s.size();
bool YN = false;
while(right != n)
{
for(int i=left;i<=right;i++)
{
for(int j=i+1;j<=right;j++)
{
if(s[i] == s[j])
{
ans++;
YN=true;
break;
}
}
if(YN)
{
YN = false;
break;
}
}
left++;
right++;
}
return ans;
}
};
2.[编程题]不重复的全排列
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
给定一个可包含重复数字的序列 nums ,按序列内字典升序返回所有不重复的全排列。
其中序列内字典升序指的是, 序列内从左到右的非降序排列,例如 nums=[1,2,3], 则因为[1,2,3] < [1,3,2], [3,1,2] < [3,2,1], [1,2,3]要先于[1,3,2]输出,[3,1,2]要先于[3,2,1]输出
输入例子1:
[3,3,4]
输出例子1:
[[3,3,4],[3,4,3],[4,3,3]]
输入例子2:
[1,10,-8]
输出例子2:
[[-8,1,10],[-8,10,1],[1,-8,10],[1,10,-8],[10,-8,1],[10,1,-8]]
代码:
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param nums int整型vector
* @return int整型vector<vector<>>
*/
vector<vector<int>> ret;
vector<int> cur;
void backtrack(vector<int>& nums, vector<int>& visited, int loc) {
int n = visited.size();
if (loc >= n) {
ret.emplace_back(cur);
return;
}
for (int i = 0; i < n; ++i) {
// if (i != 0 && nums[i] == nums[i - 1]) {
// continue;
// }
if (i > 0 && visited[i] == 0 && visited[i - 1] == 0 && nums[i] == nums[i - 1]) {
continue;
}
if (visited[i] == 0) {
cur.emplace_back(nums[i]);
visited[i] = 1;
backtrack(nums, visited, loc + 1);
cur.pop_back();
visited[i] = 0;
}
}
}
vector<vector<int> > UniquePerm(vector<int>& nums) {
// write code here
int n = nums.size();
sort(nums.begin(), nums.end());
vector<int> visited(n, 0);
backtrack(nums, visited, 0);
return ret;
}
};
3.[编程题]合并两个有序链表
时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 256M,其他语言512M
将两个降序链表合并为一个新的 降序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。
输入例子1:
{6,3,2},{11,5,1}
输出例子1:
{11,6,5,3,2,1}
输入例子2:
{1},{}
输出例子2:
{1}
输入例子3:
{0},{0}
输出例子3:
{0,0}
代码:
/**
* struct ListNode {
* int val;
* struct ListNode *next;
* ListNode(int x) : val(x), next(nullptr) {}
* };
*/
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param list1 ListNode类
* @param list2 ListNode类
* @return ListNode类
*/
ListNode* MergeTwoLists(ListNode* l, ListNode* r) {
// write code here
auto dummy = new ListNode(0);
auto temp = dummy;
while (l && r) {
if (l->val > r->val) {
temp->next = l;
l = l->next;
} else {
temp->next = r;
r = r->next;
}
temp = temp->next;
}
temp->next = l ? l : r;
return dummy->next;
}
};