Chuyển đến nội dung chính

Tìm Chuỗi Đối Xứng Dài Nhất

Đề Bài:Cho một chuỗi string S, tìm chuỗi đối xứng dài nhất trong String S

Ví Dụ 1:

Input: s = "babad"
Output: "bab"
Explanation: "aba" is also a valid answer.

Ví Dụ 2:

Input: s = "cbbd"
Output: "bb"

Lời Giải:

// Step 1: Use for loop, to check at each position in the loop
// Step 2: At each pos in the string, get a possible symetric string
// Step 3: Use find max algorithm, to get the longest symetric string

string sub_palindromic_1(string s, int pos) // aba
{
   int i = 1;
   while ((pos >= i) && (pos + i) < s.length())
   {
      if (s[pos + i] != s[pos - i])
      {
         break;
      }
      i++;
   }

   return s.substr(pos - i + 1, 2 * i - 1);
}

string sub_palindromic_2(string s, int pos) // abba
{
   int j = 0;
   while ((pos + j + 1 < s.length()) && (pos >= j))
   {
      if ((s[pos - j] != s[pos + j + 1]))
      {
         break;
      }
      j++;
   }
   return s.substr(pos - j + 1, 2 * j);
}

string longestPalindrome(string s)
{
   string s_Max = "";
   if (s.length() <= 1)
   {
      s_Max = s;
   }
   else
   {
      for (int i = 0; i < s.length(); i++)
      {
         string s_i;
         if (i == 0)
         {
            if (s[i] == s[i + 1])
            {
               s_i = sub_palindromic_2(s, i);
            }
         }
         else if ((s[i - 1] == s[i + 1]) && (s[i] == s[i + 1]))
         {
            string s1 = sub_palindromic_1(s, i);
            string s2 = sub_palindromic_2(s, i);
            if (s1.length() < s2.length())
            {
               s_i = s1;
            }
            else
            {
               s_i = s2;
            }
         }
         else if (s[i-1] == s[i+1])
         {
            s_i = sub_palindromic_1(s, i);
         }
         else if (s[i] == s[i+1])
         {
            s_i = sub_palindromic_2(s, i);
         }
         else
         {
            s_i.push_back(s[i]);
         }
         if (s_i.length() > s_Max.length())
         {
            s_Max = s_i;
         }
      }
   }
   return s_Max;
}

Cách 2:

class Solution
{
public:
   Solution();
   ~Solution();

   string longestPalindrome(string s) {
      if (s.length() < 1) return "";
      int start = 0, end = 0;
      for (int i = 0; i < s.length(); i++) {
         int len1 = expandAroundCenter(s, i, i);
         int len2 = expandAroundCenter(s, i, i + 1);
         int len = std::max(len1, len2);
         if (len > end - start) {
            start = i - (len - 1) / 2;
            end = i + len / 2;
         }
      }
      return s.substr(start, end + 1);
   }

private:
   int expandAroundCenter(string s, int left, int right) {
      int L = left, R = right;
      while (L >= 0 && R < s.length() && s[L] == s[R]) {
         L--;
         R++;
      }
      return R - L - 1;
   }

};

 

The post Tìm Chuỗi Đối Xứng Dài Nhất first appeared on Techacademy.



Nhận xét

Bài đăng phổ biến từ blog này

Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025

Rate this post Dưới đây là Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025 Bạn đọc có thể share lời giải bên dưới comment bài viết. Tham khảo: TỔNG HỢP ĐỀ THI CHUYÊN TIN TẤT CẢ CÁC TRƯỜNG TRÊN TOÀN QUỐC TỔNG HỢP ĐỀ THI HỌC SINH GIỎI TIN HỌC LỚP 9 TOÀN QUỐC TỔNG HỢP ĐỀ THI HỌC SINH GIỎI TIN HỌC LỚP 12 TOÀN QUỐC KHÓA HỌC LẬP TRÌNH C++ KHÓA HỌC LẬP TRÌNH PYTHON  The post Đề Thi HSG Tin Học Lớp 12 Tỉnh Lào Cai Năm 2025 first appeared on Techacademy .

Vẽ Tam Giác Trong C++

Vẽ tam giác trong C++ là một trong những bài tập lập trình về C++ sử dụng vòng lặp khá hay giúp các bạn luyện tư duy code cũng như cách sử dụng vòng lặp. Dưới đây là một số lời giải các bài tập vẽ tam giác trong C++ I. Vẽ Tam Giác Cân Trong C++ Viết chương trình C++ sử dụng ký tự * để vẽ tam giác vuông cân trong C++.Chúng ta sử dụng hai vòng lặp lồng nhau để giải bài toán này. Lời Giải: #include <stdio.h> #include <stdlib.h> int main() { int n; int q = 0; printf("Chuong trinh nay se in ra tam giac can\n"); printf("Nhap chieu cao tam giac cua ban: \n"); scanf("%d",&n); while (n > 0) { for (int i = 1; i<n; i++) printf("%c", ' '); for (int k = 0; k <= q; k ++) printf("%c", '*'); n -- ; q += 2 ; printf("\n"); } return 0; } II. Vẽ Hình Tam Giác Trong C++ Viết một chương trình in ra hình ...

Cách Vẽ Hình Trong Scratch

Hãy cùng Techacademy tìm hiểu cách vẽ hình trong lập trình Scratch nhé! Tại đây bạn sẽ biết thêm nhiều điều thú vị và hấp dẫn về cách vẽ các loại hình trong Scratch. I. Cách Vẽ Hình Vuông Trong Scratch Trong bài viết này mình sẽ hướng dẫn các bạn cách vẽ hình vuông trong Scratch đồng thời sử dụng kĩ thuật quay hợp lý để nhân bản tạo thành những hình vẽ đẹp đã ra trong các kì thi tin học trẻ phần vẽ hình bằng Scratch. Hãy tham khảo với onthihsg ngay nhé. + Thủ tục con vẽ hình vuông trong Scratch Trước hết ta cùng xây dựng một mảnh ghép để vẽ hình vuông với tham số là cạnh của hình vuông như sau: Cách Vẽ Hình Vuông Trong Scratch Chỉ cần một vòng lặp lại 4 lần việc vẽ một cạnh và xoay 90 độ là xong, quá đơn giản phải không nào + Vẽ các hình phức tạp hơn từ hình vuông Bây giờ ta hãy phát triển để vẽ hai hình trong đề thi tin học trẻ Đông Triều năm 2019 nào Cách Vẽ Hình Vuông Trong Scratch Nhìn hình ta thấy hình tạo thành từ 5 hình vuông vì vậy ta sẽ gọi 5 lần thủ tục vẽ h...