解题思路
本题要求从字符串中提取最后一个[img]到最后一个[\img]之间的内容。我们可以通过以下步骤解决:
- 找到最后一个[img]的位置
- 找到最后一个[\img]的位置
- 如果两者都存在且[img]在[\img]前面,则提取这段字符串
- 否则返回"null"
关键点
- 使用字符串的查找函数
- 处理特殊情况(未找到匹配、位置不合法等)
- 注意字符串的截取范围
代码
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string extractImage(string str) {
// 查找最后一个[img]和[\img]的位置
size_t imgStart = str.rfind("[img]");
size_t imgEnd = str.rfind("[\\img]");
// 如果没有找到任何一个标签,或者[img]在[\img]后面
if (imgStart == string::npos || imgEnd == string::npos || imgStart > imgEnd) {
return "null";
}
// 提取字符串
return str.substr(imgStart, imgEnd + 6 - imgStart);
}
};
int main() {
string str;
getline(cin, str);
Solution solution;
cout << solution.extractImage(str) << endl;
return 0;
}
import java.util.Scanner;
public class Main {
static class Solution {
public String extractImage(String str) {
// 查找最后一个[img]和[\img]的位置
int imgStart = str.lastIndexOf("[img]");
int imgEnd = str.lastIndexOf("[\\img]");
// 如果没有找到任何一个标签,或者[img]在[\img]后面
if (imgStart == -1 || imgEnd == -1 || imgStart > imgEnd) {
return "null";
}
// 提取字符串
return str.substring(imgStart, imgEnd + 6);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
String str = sc.nextLine();
Solution solution = new Solution();
System.out.println(solution.extractImage(str));
sc.close();
}
}
class Solution:
def extract_image(self, s: str) -> str:
# 查找最后一个[img]和[\img]的位置
img_start = s.rfind("[img]")
img_end = s.rfind("[\\img]")
# 如果没有找到任何一个标签,或者[img]在[\img]后面
if img_start == -1 or img_end == -1 or img_start > img_end:
return "null"
# 提取字符串
return s[img_start:img_end + 6]
def main():
s = input()
solution = Solution()
print(solution.extract_image(s))
if __name__ == "__main__":
main()
算法及复杂度
- 算法:字符串查找和截取
- 时间复杂度:,其中 是字符串长度
- 空间复杂度:,只使用了常数额外空间