当前位置:实例文章 » 其他实例» [文章]【C/C++ 力扣leetcode】4道简单题

【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++ 题目的解决方案。这些问题都是常见的算法面试题目,希望通过本文,你可以更好地理解这些问题的解析和解决方案。

其他信息

其他资源

Top