【C/C++ 力扣leetcode】4道简单题
发布人:shili8
发布时间:2024-11-07 12:58
阅读次数:0
**力扣 LeetCode 简单题解析**
本文将为你介绍四个简单的 C/C++ 题目,包括查找两个数组的交点、最长公共子序列、最小基因变化和最长回文子串。这些问题都是常见的算法面试题目。
###1. 查找两个数组的交点**题目描述**
给定两个有序整数数组 `nums1` 和 `nums2`,找到它们的交点。返回交点的下标,如果没有交点,则返回一个空列表。
**示例**
* 输入:`nums1 = [1,5,9,4,3], nums2 = [6,5,3,8]`
输出:`[1,5,3]`
**解决方案**
cppclass Solution {
public:
vector<int> intersection(vector<int>& nums1, vector<int>& nums2) {
// 使用set进行交集计算 set<int> s(nums1.begin(), nums1.end());
set<int> t(nums2.begin(), nums2.end());
// 将两个集合的交集存入vector中 vector<int> res;
for (auto it = s.begin(); it != s.end(); ++it) {
if (t.find(*it) != t.end()) {
res.push_back(*it);
}
}
return res;
}
};
###2. 最长公共子序列**题目描述**
给定两个字符串 `s1` 和 `s2`,找到它们的最长公共子序列(LCS)。返回 LCS 的长度。
**示例**
* 输入:`s1 = "abcde", s2 = "ace"`
输出:`3`
**解决方案**
cppclass Solution {
public:
int longestCommonSubsequence(string s1, string s2) {
// 使用动态规划计算LCS的长度 int m = s1.size();
int n = s2.size();
vector<vector<int>> dp(m +1, vector<int>(n +1));
for (int i =0; i <= m; ++i) {
for (int j =0; j <= n; ++j) {
if (i ==0 || j ==0) {
dp[i][j] =0;
} else if (s1[i -1] == s2[j -1]) {
dp[i][j] = dp[i -1][j -1] +1;
} else {
dp[i][j] = max(dp[i -1][j], dp[i][j -1]);
}
}
}
return dp[m][n];
}
};
###3. 最小基因变化**题目描述**
给定两个字符串 `s` 和 `t`,它们代表两种生物的基因序列。找到将 `s` 转换为 `t` 的最少基因变化次数。
**示例**
* 输入:`s = "bab", t = "aba"`
输出:`1`
**解决方案**
cppclass Solution {
public:
int minMutation(string s, string t, vector<string>& bank) {
// 使用BFS计算最小基因变化次数 queue<string> q;
unordered_set<string> visited;
q.push(s);
visited.insert(s);
int step =0;
while (!q.empty()) {
int size = q.size();
for (int i =0; i < size; ++i) {
string cur = q.front();
q.pop();
if (cur == t) {
return step;
}
for (auto& str : bank) {
if (visited.find(str) != visited.end()) {
continue;
}
int diff =0;
for (int j =0; j < cur.size(); ++j) {
if (cur[j] != str[j]) {
diff++;
}
}
if (diff ==1) {
q.push(str);
visited.insert(str);
}
}
}
step++;
}
return -1;
}
};
###4. 最长回文子串**题目描述**
给定一个字符串 `s`,找到最长的回文子串。
**示例**
* 输入:`s = "babad"`
输出:`"bab"`
**解决方案**
cppclass Solution {
public:
string longestPalindrome(string s) {
// 使用动态规划计算最长回文子串 int n = s.size();
vector> dp(n, vector(n));
int maxLen =1;
int start =0;
for (int i =0; i < n; ++i) {
dp[i][i] = true;
}
for (int len =2; len <= n; ++len) {
for (int l =0; l <= n - len; ++l) {
int r = l + len -1;
if (s[l] == s[r] && dp[l +1][r -1]) {
dp[l][r] = true;
if (len > maxLen) {
maxLen = len;
start = l;
}
}
}
}
return s.substr(start, maxLen);
}
};
以上是四个简单的 C/C++ 题目的解决方案。这些问题都是常见的算法面试题目,希望通过本文,你可以更好地理解这些问题的解析和解决方案。

