Найдите отсутствующий конечный тег в данном HTML-коде

Опубликовано: 9 Января, 2022

Учитывая строку htmlCode, которая представляет собой HTML-код веб-страницы, задача состоит в том, чтобы найти отсутствующий конечный тег в HTML-коде.

Примеры:

Ввод: htmlCode = "<! DOCTYPE html>"
<html>
<head>
    <название>
        GeeksforGeeks
    </title>
</head>
<body>
    <кнопка>
</body>
</html> "
Вывод: </button>

Ввод: htmlCode = "<! DOCTYPE html>"
<html>
<body>
    <p> Здравствуйте </p>
    
</html> "
Вывод: </body>

Рекомендуется: сначала попробуйте свой подход в {IDE}, прежде чем переходить к решению.

Подход: Идея состоит в том, чтобы использовать стек для отслеживания текущих начальных тегов в HTML-коде и наличия конечного тега, не совпадающего с вершиной стека, который обозначает начальный тег. Затем первым должен быть закрыт тег, который находится наверху стека. Следовательно, вершиной стека будет желаемый отсутствующий тег в HTML-коде.

Below is the implementation of the above approach:

Python

# Python implementation to find the 
# the missing end in the HTML code
  
# Function to Auto complete the 
# missing tag in the html Code
def autoComplete(s):
      
    # Split the html Code in line
    linesOfCode = list(s.strip().split(" "))
      
    # Tags which are self closed doesn"t
    # needs to be closed
    selfClosedTags = ["area""base", "br",
            "col",   "embed""hr",    "img",
            "input", "link", "meta", "param",
                    "source", "track", "wbr"]
    n = len(linesOfCode)
  
    stack = []
      
    # Loop to iterate over the
    # lines of code
    for i in range(n):
        j = 0
          
        # Current Line
        line = linesOfCode[i]
        while j < len(linesOfCode[i]):
              
            # Condition to check if the current 
            # character is a end tag in the code
            if j + 1 < len(line) and line[j] == "<"
                            and line[j + 1] == "/":
                tag = []
                j += 2
                  
                # Loop to get the tag
                while j < len(line) and
                   "a" <= line[j] <= "z":
                    tag.append(line[j])
                    j += 1
                while j < len(line) and line[j] != ">":
                    j += 1
                if stack[-1] != tag:
                    tag = stack[-1]
                    return "</" + "".join(tag) + ">"
                stack.pop()
                  
            # Conditio to check if the current 
            # character denotes the code is 
            # of the HTML 5
            elif j + 1 < len(line) and line[j] == "<"
                                  and line[j] == "!":
                continue
                  
            # Condition to check if the current 
            # tag is a start tag of the HTML Code
            elif line[j] == "<":
                tag = []
                j += 1
                  
                # Loop to get the tag of the HTML
                while j < len(line) and
                      "a" <= line[j] <= "z":
                    tag.append(line[j])
                    j += 1
                while j < len(line) and line[j] != ">":
                    j += 1
                      
                # Condition to check if the 
                # current tag is not a self closed tag
                if "".join(tag) not in selfClosedTags:
                    stack.append(tag)
            j += 1
              
    # Condition to check if any tag 
    # is unbalanced then return that tag
    if stack:
        tag = stack.pop()
        return "</" + "".join(tag) + ">"
    return -1
  
# Driver Code
if __name__ == "__main__":
    s = """<! DOCTYPE html>
<html>
<head>
    <title>
        GeeksforGeeks
    </title>
</head>
<body>
    <button>
</body>
</html>"""
    tag = autoComplete(s)
    print(tag)
Output:
</button>