Các Bài Tập LeetCode: Phân Tách Chuỗi Hồi Văn, Chèn Vị Trí, Tìm Kiếm Ma Trận

Phân Tách Chuỗi Hồi Văn

Sử dụng hai hàm: một để kiểm tra chuỗi có phải là hồi văn hay không, và một để thực hiện thuật toán quay lui.

class Solution:
    def kiemTraHoiVan(self, chuoi):
        return chuoi == chuoi[::-1]

    def quyLui(self, chuoi, viTriBatDau, duongDiHienTai, ketQua):
        if viTriBatDau >= len(chuoi):
            ketQua.append(duongDiHienTai.copy())
            return

        for i in range(viTriBatDau, len(chuoi)):
            if self.kiemTraHoiVan(chuoi[viTriBatDau:i + 1]):
                duongDiHienTai.append(chuoi[viTriBatDau:i + 1])
                self.quyLui(chuoi, i + 1, duongDiHienTai, ketQua)
                duongDiHienTai.pop()

    def phanTach(self, chuoi: str) -> List[List[str]]:
        ketQuaCuoiCung = []
        self.quyLui(chuoi, 0, [], ketQuaCuoiCung)
        return ketQuaCuoiCung

Tìm Vị Trí Chèn

Sử dụng thuật toán tìm kiếm nhị phân với khoảng đóng.

class Solution:
    def timViTriChen(self, danhSachSo: List[int], giaTriMucTieu: int) -> int:
        trai, phai = 0, len(danhSachSo) - 1
        while trai <= phai:
            giua = (trai + phai) // 2
            if danhSachSo[giua] < giaTriMucTieu:
                trai = giua + 1
            else:
                phai = giua - 1
        return trai

Tìm Kiếm Trong Ma Trận Hai Chiều

Phương Pháp Một:

Áp dụng thuật toán tìm kiếm nhị phân cho từng hàng của ma trận.

class Solution:
    def timTrongMaTran(self, maTran: List[List[int]], giaTriMucTieu: int) -> bool:
        for hang in maTran:
            trai, phai = 0, len(hang) - 1
            while trai <= phai:
                giua = (trai + phai) // 2
                if hang[giua] < giaTriMucTieu:
                    trai = giua + 1
                elif hang[giua] > giaTriMucTieu:
                    phai = giua - 1
                else:
                    return True
        return False

Phương Pháp Hai:

Xem ma trận hai chiều như một danh sách đã sắp xếp và áp dụng thuật toán tìm kiếm nhị phân.

class Solution:
    def timTrongMaTran(self, maTran: List[List[int]], giaTriMucTieu: int) -> bool:
        soHang, soCot = len(maTran), len(maTran[0])
        trai, phai = 0, soHang * soCot - 1
        while trai <= phai:
            giua = (trai + phai) // 2
            giaTriGiua = maTran[giua // soCot][giua % soCot]
            if giaTriGiua == giaTriMucTieu:
                return True
            if giaTriGiua < giaTriMucTieu:
                trai = giua + 1
            else:
                phai = giua - 1
        return False

Tìm Khoảng Của Giá Trị Trong Mảng Đã Sắp Xếp

Sử dụng thuật toán tìm kiếm nhị phân để xác định vị trí bắt đầu và kết thúc của giá trị mục tiêu.

class Solution:
    def gioiHanDuoi(self, danhSachSo, giaTriMucTieu):
        trai, phai = 0, len(danhSachSo) - 1
        while trai <= phai:
            giua = (trai + phai) // 2
            if danhSachSo[giua] < giaTriMucTieu:
                trai = giua + 1
            else:
                phai = giua - 1
        return trai

    def timKhoang(self, danhSachSo: List[int], giaTriMucTieu: int) -> List[int]:
        batDau = self.gioiHanDuoi(danhSachSo, giaTriMucTieu)
        if batDau == len(danhSachSo) or danhSachSo[batDau] != giaTriMucTieu:
            return [-1, -1]
        ketThuc = self.gioiHanDuoi(danhSachSo, giaTriMucTieu + 1) - 1
        return [batDau, ketThuc]

Thẻ: LeetCode PhânTáchChuỗiHồiVăn TìmKiếmNhịPhân MaTrậnHaiChiều

Đăng vào ngày 18 tháng 6 lúc 06:25