1.两数之和
该题目给出一个整数数组和一个目标值,要求找到数组中两个数的和等于目标值,并返回这两个数的下标。
我们可以使用哈希表来解决该问题,先遍历一遍数组,将每个数和它的下标存储到哈希表中,然后再遍历一遍数组,对于每个数,查找是否存在目标值减去该数的值在哈希表中,如果存在,返回两个数的下标即可。
以下是代码实现:
public int[] twoSum(int[] nums, int target) {
Map<Integer, Integer> map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
map.put(nums[i], i);
}
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement) && map.get(complement) != i) {
return new int[] {i, map.get(complement)};
}
}
return new int[] {};
}
2.最长回文子串
该题目给出一个字符串,要求找到其中最长的回文子串。
我们可以使用动态规划来解决该问题,定义一个二维数组dp[i][j]表示从i到j的子串是否是回文串,如果是回文串,dp[i][j]的值为true,否则为false。然后,我们遍历所有可能的子串,判断其是否是回文串,并记录最长的回文子串的长度和起始位置。
以下是代码实现:
public String longestPalindrome(String s) {
int n = s.length();
boolean[][] dp = new boolean[n][n];
int start = 0, maxLen = 1;
for (int i = 0; i < n; i++) {
dp[i][i] = true;
}
for (int j = 1; j < n; j++) {
for (int i = 0; i < j; i++) {
if (s.charAt(i) == s.charAt(j)) {
if (j - i <= 2) {
dp[i][j] = true;
} else {
dp[i][j] = dp[i + 1][j - 1];
}
} else {
dp[i][j] = false;
}
if (dp[i][j] && j - i + 1 > maxLen) {
start = i;
maxLen = j - i + 1;
}
}
}
return s.substring(start, start + maxLen);
}